You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake:是否保证自定义目标在库的依赖项前执行?

CMake构建顺序依赖问题解答

问题背景

项目结构如下:

my_project_dir
   libs/
      third-party-lib/
         configure.sh
         CMakeLists.txt
   CMakeLists.txt

my_project/libs/third-party-lib/CMakeLists.txt内容:

...
add_library(lib_inner)
add_library(lib)
target_link_libraries(lib PRIVATE lib_inner)
...

my_project_dir/CMakeLists.txt内容:

add_executable(my_exe)
add_custom_target(configure_third_party_lib ALL 
    COMMAND 
        ${CMAKE_CURRENT_SOURCE_DIR}/libs/third-party-lib/config.sh
)
add_dependencies(lib configure_third_party_lib)
target_link_libraries(my_exe PRIVATE lib)

疑问

CMake是否保证以下构建顺序?

  1. configure_third_party_lib
  2. lib_inner
  3. lib
  4. my_exe

还是可能出现以下顺序?

  1. lib_inner
  2. configure_third_party_lib
  3. lib
  4. my_exe

已知add_dependencies可保证configure_third_party_lib在lib之前执行,但不清楚lib的依赖项lib_inner的相关规则。

解答

CMake无法保证第一种顺序,第二种顺序是完全可能出现的。

原因如下:

  • add_dependencies(lib configure_third_party_lib)仅建立了configure_third_party_lib与lib之间的前置依赖:CMake会确保configure_third_party_lib在lib开始构建前完成,但这个约束不会传递给lib的依赖项。
  • 通过target_link_libraries(lib PRIVATE lib_inner),CMake仅保证lib_inner在lib之前构建,但没有任何规则约束lib_inner和configure_third_party_lib之间的执行顺序。两者属于并行的前置任务,CMake可能会根据系统资源、构建策略任意安排它们的执行顺序。

如果configure_third_party_lib生成的文件是lib_inner构建所必需的,那么当前的CMake配置存在缺陷,必须显式为lib_inner添加依赖:

add_dependencies(lib_inner configure_third_party_lib)

这样才能确保configure_third_party_lib在lib_inner和lib之前执行,进而保证第一种构建顺序。

内容的提问来源于stack exchange,提问作者Павел Романюк

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:27:53