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)
我的 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)