• 关于CMake多级目录/多个子目录/子目录文件调用另外子目录文件接口及清除CMake生成的中间文件的注意事项


    1)如果子目录代码文件相对独立,也就是没有引用其他子目录的文件,可以单独编译成库文件

    上层CMakeLists.txt通过link_libraries()来添加这个库文件

    2)如果子目录代码引用了其他子目录的文件,建议在上一层编译(前提也是相对独立)

    上层CMakeLists.txt通过aux_source_directory()来添加子目录文件

    举个例子,假设有个src目录下的代码结构如下

    1. src
    2. ├── CMakeLists.txt
    3. ├── main.c
    4. ├── utils
    5. │ ├── utils.h
    6. │ └── utils.c
    7. └── log
    8. ├── CMakeLists.txt
    9. ├── log.h
    10. └── log.c

    其中,log模块相对独立,而utils模块调用了log模块。

    log.h(在log目录)

    1. #pragma once
    2. void log1( const char* text );

    log.c(在log目录)

    1. #include "log.h"
    2. #include
    3. void log1( const char* text ){
    4. printf("[DEBUG] %s\n",text);
    5. }

    log目录下的CMakeLists.txt

    1. cmake_minimum_required(VERSION 3.16)
    2. project(log)
    3. #搜索当前目录下所有源文件
    4. aux_source_directory(./ SRC)
    5. #编译静态库文件
    6. add_library(log ${SRC})

    utils.h(在utils目录)

    1. #pragma once
    2. void doSomething();

    utils.c(在utils目录)

    1. #include "utils.h"
    2. #include "log.h"
    3. void doSomething(){
    4. log1("--doSomething--");
    5. }

    utils目录下没有CMakeLists.txt

    src目录(log和utils目录的上一级目录)下的main.c

    1. #include "utils.h"
    2. #include "log.h"
    3. int main(int argc, char** argv ){
    4. log1("--main--");
    5. doSomething();
    6. return 0;
    7. }

    src目录的CMakeLists.txt

    1. cmake_minimum_required(VERSION 3.16)
    2. project(test)
    3. #添加头文件搜索路径
    4. include_directories(${PROJECT_SOURCE_DIR}/log)
    5. include_directories(${PROJECT_SOURCE_DIR}/utils)
    6. #添加和构建子目录,会执行子目录的CMakeLists.txt
    7. add_subdirectory(log)
    8. #连接静态库
    9. link_libraries(log)
    10. #搜索utils子目录源代码文件(名), 记在UTILS_SRC变量
    11. aux_source_directory(${PROJECT_SOURCE_DIR}/utils UTILS_SRC)
    12. #生成可执行文件
    13. add_executable(demo main.c ${UTILS_SRC})

    注意到,对log模块的处理方式是

    #添加和构建子目录,会执行子目录的CMakeLists.txt
    add_subdirectory(log)

    #连接静态库
    link_libraries(log)

    对utils模块的处理方式是

    #搜索utils子目录源代码文件(名), 记在UTILS_SRC变量
    aux_source_directory(${PROJECT_SOURCE_DIR}/utils UTILS_SRC)

    #生成可执行文件
    add_executable(demo main.c ${UTILS_SRC})

    也就是通过UTILS_SRC来记录utils的所有源文件名,通过${UTILS_SRC}来引用。

    然后,构建工程&编译

    1. cd src
    2. cmake . -B build
    3. cmake --build build

    cmake . -B build 作用是 构建工程并且把中间文件保存在build目录,子目录的中间文件也会存到里面
    cmake --build build 作用是在build目录编译&链接生成目标文件(此处是demo)

    最后,可以在build目录下看到demo这个程序。

    如果要删除 build目录,这条命令:rm -rf build (也就是普通删除文件夹命令)

    末了,切记,要根据实际情况来配置CMakeLists.txt,不要生搬硬套别人的做法,此文只是抛砖引玉。

  • 相关阅读:
    Spring更简单的读取和存储
    深度学习 Day 20——优化器对比实验
    【操作系统-IO管理】IO层次结构
    2019Linux系统教程189讲-0203_RHEL8系统基本使用(文件操作)
    postman测试接口使用
    leetcode第80题:删除有序数组中的重复项 II
    Ansible自动化运维工具介绍与部署
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    dva搭建项目实例
    Excel加密,记住4个方法,轻松保护数据!
  • 原文地址:https://blog.csdn.net/H_O_W_E/article/details/132884253