CMakeList从特定文件夹下的.proto文件生成.cc和.h文件

CMakeList to generate .cc and .h files from .proto file under a specific folder

我的 CMakeLists.txt 文件中有以下 CMakeList 命令,我想在主文件夹下的 src-gen 文件夹下生成 .cc 和 .h 文件,其中 src, include 和其他东西。我输入了命令以查看它们是否有效,但它们仍然在 src-gen 文件夹之外生成,因此它不起作用。

include(FindProtobuf)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set_source_files_properties(${PROTO_SRC} ${PROTO_HEADER} PROPERTIES GENERATED TRUE)

set(PROTO_SRC ${PROTO_SRC} ${PROJECT_SOURCE_DIR}/src-gen) #does not work..
set(PROTO_HEADER ${PROTO_HEADER} ${PROJECT_SOURCE_DIR}/src-gen)#does not work..

find_package(Protobuf REQUIRED)

PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS proto/VisionData.proto)

include_directories(
  ${PROTOBUF_INCLUDE_DIRS}
  include
)

add_executable(cameraSubscriber src/main.cpp ${PROTO_SRCS} ${PROTO_HDRS})

target_link_libraries(cameraSubscriber
   ${PROTOBUF_LIBRARIES}
 )

有谁知道哪里错了,或者有什么需要补充的吗?

这来自 FindProtobuf 的限制。如果仔细查看此模块的 documentation,您会发现以下行:

The PROTOBUF_GENERATE_CPP macro and add_executable() or add_library() calls only work properly within the same directory.

事实证明,您的路径设置不起作用的原因是您正在设置相对于 PROJECT_SOURCE_DIR 的路径。如果您查看此模块的 source,您会发现输出变量完全忽略了您正在设置的变量,并将内容写入 CMAKE_CURRENT_BINARY_DIR:

list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc")
list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h")

我在我的项目中使用的解决方案是将我所有的 .proto 文件放在一个目录中,在该目录中放置一个 CMakeLists.txt 指定原型构建命令。这样你就可以在 proto 文件夹上执行 ADD_SUBDIRECTORY,你的 CMAKE_CURRENT_BINARY_DIR 将被适当地设置。

这种方法还有一个好处是可以让您选择二进制目录。我认为像这样的电话会给你最接近你要求的东西。注意第二个参数赋值给 binary_dir (reference here):

ADD_SUBDIRECTORY (${PROTO_DIRECTORY} ${PROJECT_SOURCE_DIR}/src-gen)