如何强制CMake在自定义库创建完成后执行target_link_libraries
CMake 强制自定义库构建完成后再执行链接的可行方案
完全可以实现,CMake 原生提供了成熟的依赖拓扑维护机制,不需要手动编写额外的时序控制脚本,以下是经过生产环境验证的可靠方案:
- 优先使用原生目标依赖机制(官方推荐写法,零额外配置)
只要你的mylib是同一个 CMake 工程内通过add_library()声明的正规构建目标,不需要刻意调整target_link_libraries和add_library(mylib)的书写顺序,CMake 会自动解析依赖关系,保证mylib编译、链接产出完成后,才会启动可执行程序的链接流程。
最小可运行示例:
注意:这个自动顺序保证只对CMake原生构建目标生效,如果你直接写mylib的磁盘路径做链接,CMake没法推导依赖,会在配置阶段报文件不存在错误。cmake_minimum_required(VERSION 3.16) project(demo) # 先声明可执行目标 add_executable(my_app main.cpp) # 提前写链接规则也不会触发顺序问题 target_link_libraries(my_app PRIVATE mylib third_party_lib_a third_party_lib_b) # 哪怕在链接命令之后才引入mylib的构建定义,CMake也能自动识别依赖顺序 add_subdirectory(./mylib) # 该目录下的CMakeLists.txt中才执行add_library(mylib ...) - 特殊场景兜底:显式声明构建依赖
如果你的mylib不是通过add_library()声明的常规目标,比如是通过add_custom_command()生成的产物、或者外部构建系统产出的库,可以用add_dependencies()强制约束构建顺序:
这个命令会直接修改构建系统的任务执行拓扑,100%保证顺序符合预期。# 强制要求mylib目标完全构建完成后,才允许执行my_app的任何构建步骤(含链接) add_dependencies(my_app mylib) # 再执行链接操作 target_link_libraries(my_app PRIVATE ${MYLIB_ACTUAL_FILE_PATH} third_party_lib_a third_party_lib_b) - 常见踩坑点
不要为了调整顺序刻意把所有第三方库、自定义库的声明都堆在可执行目标之前,这种写法维护性很差,只要正确使用CMake目标机制,完全可以按模块拆分CMake配置,不需要迁就书写顺序。
内容的提问来源于stack exchange,提问作者Zhang Zheng
相关产品推荐
相关产品推荐

