标题包含`protoc`生成的文件中的路径

时间:2013-01-16 09:50:08

标签: protocol-buffers

当我像这样打电话给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而不是从包含源文件的目录调用{{1}}。我在联机帮助页或帮助文本中找不到明显的选项。

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

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

在生成的文件上执行find-replace很可能更容易 而不是重构你的构建系统(在Linux / unix上使用sed命令)。

答案 1 :(得分:-1)

我最终为我的项目做的事情如下:

  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/中的常规对象文件一起提供给链接器。


  5. 然后,如果要自动化,可以从主makefile调用pb/生成文件。重要的一点是从protoc目录调用pb/,否则包含将被搞砸。

    抱歉丑陋的makefile。至少它是有效的,我希望这可以帮助你...