6

当我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,而不是从包含源文件的目录调用。我在手册页或帮助文本中没有发现明显的选项。

所以我的下一个想法是认为这是“正确的”并调整我的构建系统,但是:这两个文件是目录树中的兄弟,所以当一个包含另一个时,不需要路径。即使手动编译也会失败。

有人可以帮我吗?

4

2 回答 2

1

对生成的文件进行查找替换很可能比重组构建系统更容易(sed在 Linux/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 $@
    

    当被调用时,它本质上将生成和构建 protobuffer 文件。

  3. 在您的主 makefile 中,只需添加以下包含路径:-Ipb/.

    并且在包含协议缓冲区标头时,请使用#include <whatever.pb.h>.

  4. 将生成的目标文件添加pb/到链接步骤中。我自己我用过:

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

    并将其与obj/.


pb/然后,如果你想自动化它,你可能可以从主 makefile 调用makefile。重要的一点是protocpb/目录中调用,否则包含将被搞砸。

对不起,丑陋的makefile。至少它有效,我希望这对你有帮助......

于 2013-02-25T03:49:04.713 回答