cmake - CMake 目标依赖项来编译 protobuf 文件
问题描述
我想protobuf
用cmake/make
.
我定制COMMAND
了编译protobuf
to c++
,并将其设置为PRE_BUILD
我的静态库的依赖项。
project(mylib)
set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")
file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
foreach(PROTO_FILE in ${PROTO_FILES})
string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCE ${PROTO_FILE})
list(APPEND OUTPUT_SOURCES ${OUTPUT_SOURCE})
endforeach()
add_custom_command(TARGET ${PROJECT_NAME}
PRE_BUILD
COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "some comment")
add_library(${PROJECT_NAME} STATIC ${OUTPUT_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
运行 cmake 时出现以下错误:
CMake 错误:无法确定目标“mylib”的链接语言
不管这个错误,生成了makefile,但是当我make mylib时,它不会触发任何proto编译
解决方案
CMake 更原生的方法是添加带有OUTPUT
签名的自定义命令来生成.cc
文件,然后通常将它们用作库的源。这样,他们 CMake 就会知道它们是什么以及如何生成它们:
project(mylib)
set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")
file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
foreach(PROTO_FILE in ${PROTO_FILES})
string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCE ${PROTO_FILE})
list(APPEND OUTPUT_SOURCES ${OUTPUT_SOURCE})
endforeach()
add_custom_command(OUTPUT ${OUTPUT_SOURCES}
COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
DEPENDS ${PROTO_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "some comment")
add_library(${PROJECT_NAME} STATIC ${OUTPUT_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
通过这种方式,将有一个命令读取所有.proto
文件并生成所有.cc
文件——这意味着如果任何.proto
文件发生更改,所有.cc
文件都将重新生成。我不熟悉 Protobuffers,所以我不知道这是否合理。如果它们是独立的,最好add_custom_command
为每个输出文件引入一个。
此外,鉴于您传递给的参数protocc
,您可能必须修改路径OUTPUT_SOURCES
以正确指向生成的文件。
另请注意,CMake 带有一个定义命令的FindProtobufprotobuf_generate_cpp()
模块,因此您可能希望使用它而不是手动编码 Protobuf 支持。
推荐阅读
- ios - 创建 swift 文件的副本
- php - 如何使用 Jenkins CI 将 git repo 文件保存到本地文件夹中?
- php - 使用按钮将文本文件导入数组 (PHP/HTML)
- objective-c - 如何跨方法使用 extern
- java - Lottie 动画未按预期运行
- c# - WPF ComboBox 在一个 DataTrigger 之后不显示 SelectedItem 但在另一个 DataTrigger 之后显示
- node.js - 从箭头函数打印事件对象
- list - 带有两个参数的 Haskell 列表过滤
- php - 如何使用查询生成器在学说 2 中注入连接对象
- gnuradio - 有没有办法通过 run() 函数重新运行 top_block ?