• 【CMake】add_dependencies 命令


    【CMake】add_dependencies

    原文链接:https://blog.csdn.net/new9232/article/details/125831009
    参考链接:https://blog.csdn.net/new9232/article/details/121374943

    简介
    add_dependencies( []...)
    
    • 1

    官方文档对此的解释为 :在顶级目标之间添加依赖关系

    使顶层 target 依赖于其他顶层目标,以确保它们在 target 之前构建。顶级目标是由 add_executable(),add_library() 或 add_custom_target() 命令之一创建的。

    实例

    目录结构

    ----demo
    --------CMakeLists.txt
    --------lib
    ------------CMakeLists.txt
    ------------mymath.cpp
    ------------mymath.h
    --------src
    ------------CMakeLists.txt
    ------------main.cpp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    最外层 cmake
    # 指定cmake最低版本
    cmake_minimum_required(VERSION 3.14)
    
    # 指定工程名
    project(demo)
    
    # 添加子目录
    add_subdirectory(${PROJECT_SOURCE_DIR}/src)
    add_subdirectory(${PROJECT_SOURCE_DIR}/lib)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    lib 目录下 cmake
    # 指定cmake最低版本
    cmake_minimum_required(VERSION 3.14)
    
    // 指定库文件生成目录
    set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    // 生成库文件
    add_library(myMath SHARED ${PROJECT_SOURCE_DIR}/lib/mymath.cpp)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    src 目录下 cmake
    # 指定cmake最低版本
    cmake_minimum_required(VERSION 3.14)
    
    # 指定头文件位置
    include_directories(${PROJECT_SOURCE_DIR}/lib)
    
    # 设置可执行文件生成目录
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    # 生成可执行文件
    add_executable(test ${PROJECT_SOURCE_DIR}/src/main.cpp)
    
    # 链接动态库
    target_link_libraries(test ${PROJECT_BINARY_DIR}/bin/libmyMath.so)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    测试

    直接编译代码

    [root@dev build]# make
    Scanning dependencies of target res
    [ 25%] Building CXX object src/CMakeFiles/res.dir/main.cpp.o
    make[2]: *** No rule to make target 'bin/libmyMath.so', needed by 'bin/res'.  Stop.
    make[1]: *** [CMakeFiles/Makefile2:91: src/CMakeFiles/res.dir/all] Error 2
    make: *** [Makefile:84: all] Error 2
    [root@dev build]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以看到会有报错,

    因为在最外层 CMakeLists.txt 中,添加子目录时,先添加 src 子目录,

    即,在生成可执行文件res时,链接库文件的时候,库文件还没有生成。

    当然可以调整添加子目录的顺序,先生成库文件,再生成可执行文件。

    但在实际开发中,链接库文件时,库文件还未生成的场景还是比较多的。

    这个时候就可以使用 add_dependencies 命令。修改 src 目录下的 cmake

    # 指定cmake最低版本
    cmake_minimum_required(VERSION 3.14)
    
    # 指定头文件位置
    include_directories(${PROJECT_SOURCE_DIR}/lib)
    
    # 设置可执行文件生成目录
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    # 生成可执行文件
    add_executable(test ${PROJECT_SOURCE_DIR}/src/main.cpp)
    
    # 指定依赖
    add_dependencies(test myMath)
    
    # 链接动态库
    target_link_libraries(test ${PROJECT_BINARY_DIR}/bin/libmyMath.so)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    添加 add_dependencies(res myMath),意思就是告诉编译器:

    我知道生成 test 可执行程序要链接 myMath 库文件,

    但是现在还没有这个库文件,你先生成 test,我随后就把库文件 myMath 给你生成出来。

  • 相关阅读:
    什么是Vue开发技术
    协同育人|电巢携手武汉软件工程职业学院项目实训顺利开班!
    Flutter ー Authentication 认证
    如何在小程序的个人中心页面进行装修
    STM32cubeMX详细教学及多个小项目合集(包含RTOS)
    sqlalchemy expire_all 方法详解,强制刷新会话缓存
    可持久化01Trie
    Linux系统彻底卸载MySQL数据库
    Elasticsearch 搜索入门技术之一
    TS代码整洁之道(下)
  • 原文地址:https://blog.csdn.net/DMLearner/article/details/133348251