2013-01-16 88 views
4

生成的文件路徑當我打電話protoc這樣頭包括在由`protoc`

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

文件

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

產生這是我想要的是。但是,由於cc需要h,該h包含這樣

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

這是我想要的。背景是我的構建工具(scons)從項目的根目錄調用protoc,而不是從包含源文件的目錄中調用protoc。我在聯機幫助頁或幫助文本中找不到明顯的選項。

所以我的下一個想法是認爲這是「正確的」,並調整自己的編譯系統,但是:這兩個文件是在目錄樹中的兄弟姐妹,所以當一個包括其他的,不需要路徑。即使手工編譯也失敗。

有人可以幫我嗎?

回答

-1

我最終什麼事做我的項目如下:

  1. 在同一水平作爲include/src/目錄創建一個pb/目錄。

  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 [email protected] 
    

    這將從根本上產生和調用時建立protobuffer文件。

  3. 在你的主生成文件,只需添加以下路徑:-Ipb/

    而且包括協議緩衝區頭時,使用#include <whatever.pb.h>

  4. pb/生成的目標文件添加到您的鏈接步驟。我自己,我用:

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

    並給了該給連接器與普通對象文件一起在obj/


然後,如果你想自動執行它,你可以調用可能從主生成文件的生成文件pb/。重要的一點是protoc應該從pb/目錄中調用,否則include會被搞亂。

對不起,醜陋的makefile。至少它有效,我希望這可以幫助你...

1

對生成的文件執行查找替換操作比對您的編譯系統進行重組(在Linux/unix上使用sed命令)很可能更容易 。