• cmake简洁教程 - 第二篇


    由于cmake内容较多,篇幅较长,为了不让人疲倦,分成了多篇博客,全部博客链接如下

    cmake简洁教程 - 第一篇_YZF_Kevin的博客-CSDN博客

    cmake简洁教程 - 第二篇_YZF_Kevin的博客-CSDN博客

    cmake简洁教程 - 第三篇_YZF_Kevin的博客-CSDN博客

    cmake简洁教程 - 第四篇_cmake全局变量_YZF_Kevin的博客-CSDN博客

    cmake简洁教程 - 第五篇_YZF_Kevin的博客-CSDN博客

    这是博客cmake简洁教程的第二篇,主要介绍如何使用cmake编译多个源文件,以及如何编译多目录下的源文件

    第一小节:如何使用cmake编译多个源文件

    接上篇博客,但这次我们又添加了fun1.c,  fun1.h,  fun2.c,  fun2.h 四个文件,现在目录如下图

     其中func1.h,  func1.c文件内容如下(分别是函数func1()的声明和实现,只有一个printf打印)

    1. #pragma once
    2. void func1();
    1. #include
    2. #include "func1.h"
    3. void func1()
    4. {
    5. printf("this is func1() \n");
    6. }

    其中func2.h,  func2.c文件内容如下(分别是函数func2()的声明和实现,只有一个printf打印)

    1. #pragma once
    2. void func2();
    1. #include
    2. #include "func2.h"
    3. void func2()
    4. {
    5. printf("this is func2() \n");
    6. }

    其中main.c文件内容如下(包含头文件后,分别调用了函数func1() 和 函数func2())

    1. #include
    2. #include "func1.h"
    3. #include "func2.h"
    4. int main(void)
    5. {
    6. printf("Hello World\n");
    7. func1();
    8. func2();
    9. return 0;
    10. }

    我们编辑CMakeLists.txt文件,内容如下

    1. cmake_minimum_required (VERSION 3.5)
    2. project (demo)
    3. add_executable(main main.c func1.c func2.c)

    重点:add_executable()命令中指明要使用的源文件是main.c, fun1.c, fun2.c

    好了,我们再依次执行命令 cmake . 和命令 make ,可以看到目标文件就被编译出来了,如下图

     执行命令 ./main 可以看到,如我们预料,成功调用了func1() 和 func2()

    依次类推,如果我们需要编译100个源文件,那就需要在add_executable()命令中添加所有的源文件

    更可怕的是一旦我们新加了代码文件,就要修改CMakeLists.txt文件并重新生成makefile才能生成可执行文件

    这个做法太low了,有没有比较优雅的方法呢?有!

    新命令 aux_source_directory(dir var)  

    意思是把目录 dir 里面的所有源文件(即.c和.cpp文件)都放在变量 var 中

    好了,我们改造上面这个例子,重新编辑CMakeLists.txt文件,内容如下

    1. cmake_minimum_required (VERSION 3.5)
    2. project (demo)
    3. aux_source_directory(. SRC_FILES)
    4. add_executable(main ${SRC_FILES})

    注意:

    第3行的意思是把当前目录的所有源文件都放在变量SRC_FILES中

    第4行的意思是编译目标文件main时,使用的源文件是变量SRC_FILES表示的源文件列表

    重新执行命令 cmake .make ,依然可以成功,如下图

    因为aux_source_directory(dir var) 是把指定目录下的所有源文件都加入到了变量var中,如果我们不想编译某些源文件呢?

    还有一个set命令,例如

    set( SRC_FILES main.c testFunc1.c testFunc.c)

    意思是给把3个源文件(main.c testFunc1.c testFunc.c)赋给变量 SRC_FILES,接下来正常使用变量 SRC_FILES 即可,还是上面的例子,改造如下

    1. cmake_minimum_required (VERSION 3.5)
    2. project (demo)
    3. set (SRC_FILES main.c func1.c func2.c)
    4. add_executable(main ${SRC_FILES})

    重新执行命令 cmake .     make    ./main,一样可以成功执行

    第二小节:如何使用cmake编译多个目录

    上一小节我们讲解了如何使用cmake编译多个文件,但这些文件都是同一个目录的,属于比较理想的情况。实际上工程很可能会根据功能的不同而放在不同的目录,这样便于查找

    类似下面的架构图(func1.h和func1.c放在子目录func1;func2.h和func2.c放在子目录func2中)

    这种情况下,该如何写CMakeLists.txt?  其实也很简单,如下

    1. cmake_minimum_required (VERSION 2.8)
    2. project (demo)
    3. include_directories (func1 func2)
    4. aux_source_directory (func1 SRC_LIST1)
    5. aux_source_directory (func2 SRC_LIST2)
    6. add_executable (main main.c ${SRC_LIST1} ${SRC_LIST2})

     这里解释下

    第3行:include_directories (func1 func2) 的意思是把子目录fun1,func2包含进工程,如果不写这行,那么代码中包含func1.h时就只能写"func1/func1.h",不太雅观

    第4行,5行就简单了,把对应目录的源文件放在变量中

    第6行编译命令,需要注意的是这里属于混合用法,既可以指定源文件main.c,也可以指定变量代表的源文件,中间用空格分隔即可

    我们依次执行命令 cmake .     make     ./main,可以看到依然可以执行成功

    本篇总结(2个新命令,1个旧命令的新用法)

    旧命令新用法

    add_executable(main main.c func1.c func2.c)   有多个源文件时,多个源文件中间用空格分开

    add_executable(main SRC_FILES )  使用指定变量 SRC_FILES代表的源文件来编译可执行文件

    新命令
    1. aux_source_directory(dir var)   把目录dir里面的所有源文件(即.c和.cpp文件)都放在变量 var 中
    2. set( SRC_FILES main.c testFunc1.c testFunc.c)  把指定源文件赋给变量 SRC_FILES

    3. include_directories (func1 func2) 指定多个目录作为工程的头文件搜索路径,多个路径中间用空格分开

    下一篇我们将会讲解更“正规”的cmake用法

    cmake简洁教程 - 第三篇_cmake 全局变量_YZF_Kevin的博客-CSDN博客

  • 相关阅读:
    Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程
    两种MySQL OCP认证应该如何选?
    ppt 作图 如何生成eps格式
    软件架构模式+系统架构
    线性回归模型(OLS)2
    如何实现基于 SaaS 的多租户多因素认证(MFA)?
    覆盖element-ui的el-menu样式记录:背景图片、菜单图标、菜单高亮与鼠标悬浮高亮、调整子菜单等样式
    【以图搜图】GPU&NPU适配万物识别模型和Milvus向量数据库
    kubernetes(K8S)学习笔记P4:K8s核心概念1
    如何使用ps制作ico图标文件
  • 原文地址:https://blog.csdn.net/yzf279533105/article/details/126513771