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
命令)