Protocol buffers 头文件包含由“protoc”生成的文件中的路径`

Protocol buffers 头文件包含由“protoc”生成的文件中的路径`,protocol-buffers,Protocol Buffers,当我像这样调用protoc时 protoc --cpp_out=. path/to/test.proto #include "path/to/test.pb.h" 档案 path/to/test.pb.cc和 path/to/test.pb.h 这就是我想要的。但是,由于cc需要h,因此h如下所示 protoc --cpp_out=. path/to/test.proto #include "path/to/test.pb.h" 这不是我想要的。背景是我的构建工具(scons)从项目

当我像这样调用
protoc

protoc --cpp_out=. path/to/test.proto
#include "path/to/test.pb.h"
档案

  • path/to/test.pb.cc
  • path/to/test.pb.h
这就是我想要的。但是,由于
cc
需要
h
,因此
h
如下所示

protoc --cpp_out=. path/to/test.proto
#include "path/to/test.pb.h"
这不是我想要的。背景是我的构建工具(
scons
)从项目的根目录调用
protoc
,而不是从包含源文件的目录调用。我在手册页或帮助文本中找不到明显的选项

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


有人能帮我吗?

我最终为我的项目做了如下工作:

  • 在与
    include/
    src/
    目录相同的级别上创建一个
    pb/
    目录

  • .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 $@
    
    并将其与
    obj/
    中的普通对象文件一起提供给链接器


  • 然后,如果希望自动化,您可能可以从主makefile调用
    pb/
    makefile。重要的一点是从
    pb/
    目录调用
    protoc
    ,否则include将被弄乱


    很抱歉这些丑陋的makefiles。至少它能工作,我希望这能帮助您……

    在生成的文件上查找替换很可能更容易 然后重新组织构建系统(在Linux/unix上使用
    sed
    命令)