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

wal*_*mat 6 protocol-buffers

当我打电话protoc这样的

protoc --cpp_out=. path/to/test.proto
Run Code Online (Sandbox Code Playgroud)

文件

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

是我想要的。但是,由于cc需要h,所以h像这样包含

#include "path/to/test.pb.h"
Run Code Online (Sandbox Code Playgroud)

不是我想要的。背景是我的构建工具(sconsprotoc从项目的根目录而不是从包含源文件的目录中调用。我在手册页或帮助文本中找不到明显的选项。

因此,我的下一个想法是将其视为“正确”并调整构建系统,但是:这两个文件是目录树中的同级文件,因此当一个文件包含另一个文件时,则不需要路径。甚至手工编译也会失败。

有人可以帮我吗?

Tho*_*mas 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 $@
    
    Run Code Online (Sandbox Code Playgroud)

    这将在调用时本质上生成并构建 protobuffer 文件。

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

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

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

    PB_OBJS = $(shell find pb/ -name '*.pb.o')
    
    Run Code Online (Sandbox Code Playgroud)

    并将其与obj/.


然后,如果您想自动化它,您可以pb/从主 makefile 调用 makefile。重要的一点是protoc从目录中调用pb/,否则包含将会混乱。

对于丑陋的 makefile 感到抱歉。至少它有效,我希望这对你有帮助......