CMake多目录场景下如何让Project2依赖并联动构建proto库
实现步骤
1. 修改根目录CMakeLists.txt
你之前仅将Project2添加为子目录,现在需要先把proto库所在的目录也声明为子目录,注意要放在Project2的子目录声明之前,确保依赖目标优先被处理:
# 保留原有其他配置不变 add_subdirectory(somePlace/someOtherPlace) add_subdirectory(Project2)
2. 优化proto库的CMake配置(可选但推荐)
原有配置里的全局INCLUDE_DIRECTORIES作用域太宽,建议改成给proto库单独设置公开包含路径,依赖该库的目标会自动继承头文件搜索路径,不需要额外手动配置路径:
INCLUDE(FindProtobuf) FIND_PACKAGE(Protobuf REQUIRED) PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HEADER some.proto) ADD_LIBRARY(proto ${PROTO_HEADER} ${PROTO_SRC}) # 新增以下配置 target_include_directories(proto PUBLIC ${PROTOBUF_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} # 生成的.pb.h文件存放在构建目录的对应子路径下 )
3. 修改Project2的CMakeLists.txt添加依赖
不需要额外新增add_executable/add_library命令,保留你原有Project2的目标声明(无论是可执行文件还是库)即可,只需要添加链接proto库的配置:
假设你的Project2是可执行目标,原有配置为add_executable(Project2 xxx.cpp xxx.hpp),在该声明之后添加以下内容:
target_link_libraries(Project2 PRIVATE proto ${PROTOBUF_LIBRARIES} )
如果Project2本身是库目标,根据你的业务需求把PRIVATE改成PUBLIC或者INTERFACE即可。
配置完成后重新生成构建系统,再执行make Project2时,CMake会自动识别依赖关系,先构建proto库再编译Project2,proto文件修改后也会自动触发代码重新生成、库编译、Project2重链接的全流程。
内容的提问来源于stack exchange,提问作者Meric Ozcan
相关产品推荐
相关产品推荐

