【问题标题】:Header include path in files generated by `protoc`标头包含由`protoc`生成的文件中的路径
【发布时间】:2013-10-24 15:06:37
【问题描述】:

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

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

有人可以帮我吗?

【问题讨论】:

    标签: protocol-buffers


    【解决方案1】:

    对生成的文件进行查找替换很可能更容易 而不是重组构建系统(在 Linux/unix 上使用 sed 命令)。

    【讨论】:

      【解决方案2】:

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

      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 $@
        

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

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

        当包含协议缓冲区标头时,使用#include &lt;whatever.pb.h&gt;

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

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

        并将其与obj/ 中的普通目标文件一起提供给链接器。


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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-11
        • 2014-10-21
        • 2023-03-29
        • 1970-01-01
        • 2015-01-27
        • 2012-12-16
        • 2016-09-03
        • 2021-05-16
        相关资源
        最近更新 更多