6

protocこう呼んだら

protoc --cpp_out=. path/to/test.proto

ファイル

  • path/to/test.pb.cc
  • path/to/test.pb.h

私が欲しいものが生成されます。しかし、 には がcc必要なので、このようhhが含まれています。

#include "path/to/test.pb.h"

これは私が望むものではありません。背景は、私のビルド ツール ( ) が、ソース ファイルを含むディレクトリからではなく、プロジェクトのルートからscons呼び出していることです。protocマンページまたはヘルプ テキストに明確なオプションが見つかりませんでした。

したがって、私の次のアイデアは、これを「正しい」と見なし、ビルド システムを調整することでしたが、2 つのファイルはディレクトリ ツリーの兄弟であるため、一方が他方を含む場合、パスは必要ありません。手でコンパイルしても失敗します。

誰かがそれを手伝ってくれますか?

4

2 に答える 2

1

生成されたファイルに対して find-replace を実行することは、おそらくビルド システムを再編成するよりも簡単です ( sedLinux/unix ではコマンドを使用します)。

于 2013-10-24T07:06:37.753 に答える
0

私が自分のプロジェクトのためにやったことは次のとおりです。

  1. およびディレクトリpb/と同じレベルでディレクトリを作成します。include/src/

  2. そこにファイルを入れて.proto、makefileを作成します。その中に次のように書いてください。

    CXX = g++
    CXXFLAGS = -O3
    
    PROTOBF = $(shell find ./ -name '*.proto')
    SOURCES = $(subst proto,pb.cc,$(PROTOBF))
    OBJECTS = $(subst proto,pb.o,$(PROTOBF))
    
    default: $(OBJECTS)
        @echo -n
    
    $(SOURCES): %.pb.cc : %.proto
        protoc --cpp_out=. $<
    
    $(OBJECTS): %.pb.o : %.pb.cc
        $(CXX) $(CXXFLAGS) -c $< -o $@
    

    これは基本的に、呼び出されたときにプロトバッファファイルを生成およびビルドします。

  3. メインのmakefileに、次のインクルードパスを追加するだけです-Ipb/

    また、プロトコルバッファヘッダーを含める場合は、を使用します#include <whatever.pb.h>

  4. pb/で生成されたオブジェクトファイルをリンクステップに追加します。私が使用した自分:

    PB_OBJS = $(shell find pb/ -name '*.pb.o')
    

    そして、それを。の通常のオブジェクトファイルと一緒にリンカに渡しましたobj/


pb/次に、自動化する場合は、メインのmakefileからmakefileを呼び出すことができます。重要な点はprotoc、ディレクトリから呼び出されるpb/か、インクルードが台無しになることです。

醜いmakefilesでごめんなさい。少なくともそれは機能します、そして私はこれがあなたを助けることを願っています...

于 2013-02-25T03:49:04.713 に答える