CMake编译文件

参考链接:https://www.bilibili.com/video/BV16V411k7eF?p=8&spm_id_from=pageDriver

  1. 编译过程:

    gcc -E main.c -o main.i 通过-E生成预处理文件

    gcc -S main.i 对预处理文件进行编译生成main.s

    gcc -c main.s 对文件进一步汇编生成main.o

    gcc main.o -o main 最后生成可执行文件

  2. 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

    CMake 就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTKITKKDEOpenCVOSG 等。

  3. 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

    1. 编写 CMake 配置文件 CMakeLists.txt 。
    2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile(ccmakecmake 的区别在于前者提供了一个交互式的界面)。其中, PATH 是 CMakeLists.txt 所在的目录。
    3. 使用 make 命令进行编译。
  4. demo1的Cmake的简单实现

    demo1中有功能为打印hello worldmain.cpp文件或者其他.cpp文件。

    首先新建并编辑CMakeLists.txt文件:vim CMakeLists.txt

    CMAKE_MINIMUM_REQUIRED(VERSION 3.10)  #版本号
    
    PROJECT(demo1)  #工程名
    
    ADD_EXECUTABLE(demo1 main.cpp)  #可执行文件,有main.cpp生成demo1的可执行文件
    

    然后在当前文件下执行cmake操作:cmake ./ 其中,./表示在当前文件下。

    可以查看文件中已经有Makefile,就可以执行make命令进行编译,生成可执行文件demo1。

  5. demo2的CMake实现(demo2中存在多个.cpp文件用变量来代替)

    demo2中存在两个cpp文件,main.cpp和test1.cpp。

    首先新建并编辑CMakeLists.txt文件:vim CMakeLists.txt

    CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
    
    PROJECT(demo2)
    
    AUX_SOURCE_DIRECTORY(./ DIR_SRCS)  #./为当前文件夹下,发现一个目录下所有的源代码文件并将列表存储在一个变量中
    
    ADD_EXECUTABLE(demo2 ${DIR_SRCS})  #这里只使用变量就可以调用所有的源文件cpp
    

    然后在当前文件下执行cmake操作:cmake ./ 其中,./表示在当前文件下。

    可以查看文件中已经有Makefile,就可以执行make命令进行编译,生成可执行文件demo2。

  6. demo3的CMake实现(demo3中多目录多文件)

    demo3中存在多个文件夹,且文件夹中也有源文件cpp等。
    先对demo3中的文件夹进行CMake,进入demo3中子文件夹的CMakeLists.txt:

    AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)  #.为当前文件夹下,发现一个目录下所有的源代码文件并将列表存储在一个变量中
    add_library(Mylib STATIC ${DIR_LIB_SRCS})  #生成静态库,提供外面使用
    

    然后对demo3进行总的CMake,编辑demo3文件中的CMakeLists.txt:

    CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
    
    PROJECT(demo3)
    
    ADD_SUBDIRECTORY(./mylib)  #向当前工程添加存放源文件的子目录
    
    AUX_SOURCE_DIRECTORY(./ DIR_SRCS)
    
    ADD_EXECUTABLE(demo3 ${DIR_SRCS})
    
    TARGET_LINK_LIBRARIES(demo3 Mylib)  #为项目demo3添加需要链接的共享库
    

    然后在当前文件下执行cmake操作:cmake ./ 其中,./表示在当前文件下。

    可以查看文件中已经有Makefile,就可以执行make命令进行编译,生成可执行文件demo3。

  7. demo4的CMake实现(标准工程)

    在demo4中创建如下工程:

    .
    ├── build
    ├── CMakeLists.txt
    ├── mylib
    │   ├── CMakeLists.txt
    │   ├── test1.cpp
    │   └── test1.hpp
    └── src
        ├── CMakeLists.txt
        └── main.cpp
    

    首先编辑src中的CMakeLists.txt:

    INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib)
    
    AUX_SOURCE_DIRECTORY(./ DIR_SRCS)
    
    ADD_EXECUTABLE(demo4 ${DIR_SRCS})
    
    TARGET_LINK_LIBRARIES(demo4 Mylib)
    

    编辑mylib中的CMakeLists.txt:

    AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
    
    ADD_LIBRARY(Mylib STATIC ${DIR_LIB_SRCS})
    

    编辑总的CMakeLists.txt

    CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
    
    PROJECT(demo4)
    
    ADD_SUBDIRECTORY(./mylib)
    
    ADD_SUBDIRECTORY(./src)
    

    最后执行编译和运行

    cd build    #在build中编译
    cmake ..    # ..为上一级目录,因为CMakeLists.txt在上一级
    make
    ./src/demo4  #运行demo4
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值