2

後世のために私の作品を投稿します。最後の例を C++ で書き終えた後、実際にはずっと C で行う必要があることに気付きました (すごいですよね?)。どちらの反復も、Java プログラマーとしてかなりの労力を要しました。そこにあるサンプル コードの多くは、あまりにも多くの穴を残していると思います。プロジェクトを構築し、依存関係を処理するために、Eclipseと言います。

brew で OSX の依存関係をインストールする方法:

brew install flatcc
brew install zeromq

すべての標準ビルダー バイナリもインストールする必要があります。gcc を使用してコンパイルしました。

gcc publisher.c -o bin/zmq_pub -lzmq -lflatcc
gcc subscriber.c -o bin/zmq_sub -lzmq

これは、brew がインストールを完了した後に /usr/local/include にシンボリック リンクされる zmq および flatcc ライブラリがインストールされていることを前提としています。このような:

zmq_cpub $ls -la /usr/local/include lrwxr-xr-x 1 user group 37 Oct 18 18:43 flatcc -> ../Cellar/flatcc/0.3.4/include/flatcc

次のようなコンパイル エラーが発生します Undefined symbols for architecture x86_64:。ライブラリが正しくインストール/リンクされていない場合。コンパイラ/リンカーは関数の名前を変更し、それらの前に _ を付けて、あなたを混乱させる可能性があります。. があるはずUndefined symbols for architecture x86_64 _flatcc_builder_initがないのに_flatcc_builder_init

これは、C / C++ でのライブラリのリンクが Java とは根本的に異なるためです。JAR を追加する特定のプロジェクト ビルド パスの代わりに、外部 C / C++ ライブラリをインストールできる既知の場所があります。/usr/local/include/usr/local/lib/usr/lib、および/usr/include

flatcc バイナリをパスにインストールした後、ローカル プロジェクトで使用するヘッダー ファイルを生成することを忘れないでください。

flatcc -a Car.fbs

これは、Cレーンを下る旅で直面したほとんどすべての障害であるはずです. それが誰かを助けることを願っています。

4

1 に答える 1

5

カー.fbs

namespace Test;

table Car {
    name: string;
    model: string;
    year: int;
}
root_type Car;

Subscriber.c (着信構造体をリッスンする)

//  Hello World client
#include "flatbuffers/Car_builder.h" // Generated by `flatcc`.
#include "flatbuffers/flatbuffers_common_builder.h"
#include <zmq.h>

#undef ns
#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(Test, x) // Specified in the schema

struct Car {
    char* name;
    char* model;
    int year;
};

int main (void)
{
    printf ("Connecting to car world server...\n");
    void *context = zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");

    int request_nbr;
    for (request_nbr = 0; request_nbr != 10; request_nbr++) {
        char buffer [1024];
        printf ("Sending ready signal %d...\n", request_nbr);
        zmq_send (requester, "Hello", 5, 0);
        zmq_recv (requester, buffer, 1024, 0);
        printf ("Received car %d\n", request_nbr);
        ns(Car_table_t) car = ns(Car_as_root(buffer));
        int year = ns(Car_year(car));
        flatbuffers_string_t model = ns(Car_model(car));
        flatbuffers_string_t name = ns(Car_name(car));

        struct Car nextCar;
        // no need to double up on memory!!
        // strcpy(nextCar.model, model);
        // strcpy(nextCar.name, name);
        nextCar.model = model;
        nextCar.name = name;
        nextCar.year = year;

        printf("Year: %d\n", nextCar.year);
        printf("Name: %s\n", nextCar.name);
        printf("Model: %s\n", nextCar.model);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

Publisher.c (zmq ソケット経由で構造体を送信):

//  Hello World server

#include "flatbuffers/Car_builder.h" // Generated by `flatcc`.
#include "flatbuffers/flatbuffers_common_builder.h"
#include <zmq.h>
#include <unistd.h>
#include <time.h>

#undef ns
#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(Test, x) // specified in the schema

struct Car {
    char name[10];
    char model[10];
    int year;
};

struct Car getRandomCar() {
    struct Car randomCar;
    int a = rand();
    if ((a % 2) == 0) {
        strcpy(randomCar.name, "Ford");
        strcpy(randomCar.model, "Focus");
    } else {
        strcpy(randomCar.name, "Dodge");
        strcpy(randomCar.model, "Charger");
    }
    randomCar.year = rand();
    return randomCar;
}

int main (void)
{
    srand(time(NULL));

    //  Socket to talk to clients
    void *context = zmq_ctx_new ();
    void *responder = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (responder, "tcp://*:5555");
    assert (rc == 0);
    int counter = 0;

    while (1) {
        struct Car c = getRandomCar();

        flatcc_builder_t builder, *B;
        B = &builder;
        // Initialize the builder object.
        flatcc_builder_init(B);
        uint8_t *buf; // raw buffer used by flatbuffer
        size_t size; // the size of the flatbuffer
        // Convert the char arrays to strings
        flatbuffers_string_ref_t name = flatbuffers_string_create_str(B, c.name);
        flatbuffers_string_ref_t model = flatbuffers_string_create_str(B, c.model);

        ns(Car_start_as_root(B));
        ns(Car_name_add(B, name));
        ns(Car_model_add(B, model));
        ns(Car_year_add(B, c.year));
        ns(Car_end_as_root(B));
        buf = flatcc_builder_finalize_buffer(B, &size);

        char receiveBuffer [10];
        zmq_recv (responder, receiveBuffer, 10, 0);
        printf ("Received ready signal. Sending car %d.\n", counter);
        sleep (1);          //  Do some 'work'
        zmq_send (responder, buf, size, 0);
        counter++;

        free(buf);
    }
    return 0;
}
于 2016-10-19T20:40:08.593 に答える