能否创建CMake伪目标统一管理编译与链接选项?
用CMake INTERFACE目标实现统一依赖配置
完全可以实现你要的效果,核心是用CMake的INTERFACE库目标——它本身不生成任何二进制文件,专门用来传递编译选项、包含目录、链接选项和库文件等配置,正好作为你需要的「伪目标」。
具体实现步骤:
创建INTERFACE伪目标
用add_library创建一个INTERFACE类型的目标,命名为openssl_pseudo_target:add_library(openssl_pseudo_target INTERFACE)给伪目标绑定OpenSSL的所有配置
将原本分散的编译、链接配置全部绑定到这个INTERFACE目标上:# 设置头文件包含目录 target_include_directories(openssl_pseudo_target INTERFACE ${OPENSSL_INSTALL_DIR}/include ) # 设置库文件搜索目录 target_link_directories(openssl_pseudo_target INTERFACE ${OPENSSL_INSTALL_DIR}/lib ) # 设置需要链接的库文件 target_link_libraries(openssl_pseudo_target INTERFACE libssl.a libcrypto.a )这里用
INTERFACE关键字表示,这些配置会传递给所有链接该伪目标的目标(比如你的my_program)。在主程序中直接链接伪目标
现在只需要在target_link_libraries中引用这个伪目标即可,所有OpenSSL相关配置会自动生效:target_link_libraries(my_program PUBLIC boost_program_options openssl_pseudo_target )
配合ExternalProject_Add的注意事项
如果你是用ExternalProject_Add编译OpenSSL,需要确保OPENSSL_INSTALL_DIR在CMake配置阶段就能被正确获取。可以通过ExternalProject_Get_property来提取外部项目的安装路径:
# 先定义外部编译OpenSSL的任务 ExternalProject_Add(openssl_external # 这里填写你的ExternalProject_Add参数,比如URL、CMAKE_ARGS等 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/openssl_install ) # 获取外部项目的安装目录 ExternalProject_Get_property(openssl_external INSTALL_DIR) set(OPENSSL_INSTALL_DIR ${INSTALL_DIR}) # 确保伪目标依赖外部项目任务,保证安装完成后再配置 add_dependencies(openssl_pseudo_target openssl_external)
这样所有配置都集中在伪目标中,和Boost这类自带CMake目标的使用方式完全统一,避免了分散配置的麻烦。
内容的提问来源于stack exchange,提问作者John Graham
相关产品推荐
相关产品推荐

