• CMake的学习


    CMake简介

    使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。

    CMake安装

    ubuntu上直接执行 sudo apt install cmake 安装完成,可以通过cmake -version查看其版本:

    在这里插入图片描述

    CMake使用简介

    cmake_minimum_required (VERSION 3.0) #要求cmake最低的版本号
    project (demo) 	# 定义当前工程名字
    set(CMAKE_BUILD_TYPE "Debug")	# 设置debug模式,如果没有这一行将不能调试设断点
    set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
    add_executable(main main.c)
    # 进入子目录下执行 CMakeLists.txt文件 这里的lib和tests里面都有可编译的代码文件
    add_subdirectory(lib)
    add_subdirectory(tests)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果需要编译的有多个源文件,可以都添加到add_executable(main main.cpp test.cpp)列表当中,但是如果源文件太多,一个个添加到add_executable的源文件列表中,就太麻烦了,此时可以用
    aux_source_directory(dir var)来定义源文件列表,使用如下:

    cmake_minimum_required (VERSION 3.0)
    project (demo)
    aux_source_directory(. SRC_LIST) # 定义变量,存储当前目录下的所有源文件
    add_executable(main ${SRC_LIST})
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下:

    cmake_minimum_required (VERSION 3.0)
    project (demo)
    set( SRC_LIST
    	./main.cpp
    	./test.cpp)
    add_executable(main ${SRC_LIST})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用示例

    muduo网络库的服务器,在编译链接时的命令:

    在这里插入图片描述

    在CMakeLists.txt上的写法:

    在这里插入图片描述

    cmake_minimum_required(VERSION 3.0)
    
    # 工程的名字,不是可执行文件名字
    project(main)
    
    # 配置编译选项
    set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
    
    # 配置头文件搜索路径
    # include_directories()
    
    # 配置库文件搜索路径
    # link_directories()
    
    # 设置需要编译的源文件列表
    set(SRC_LIST ./muduo_server.cpp)
    
    # 设置可执行文件最终存储路径
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    
    # 把指定路径下的所有源文件名字放入变量名SRC_LIST里面
    # aux_source_directory(. SRC_LIST)
    
    # 最终生成的文件, 通过谁来生成
    add_executable(server ${SRC_LIST})
    
    # 表示server这个目标程序,需要连接muduo_net muduo_base pthread这三个库文件
    target_link_libraries(server muduo_net muduo_base pthread)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在build文件夹下执行cmake …

    在这里插入图片描述

    再执行make
    在这里插入图片描述

    CMakeLists.txt里编写的最终生成可执行文件在bin目录下,所以去bin里面。
    在这里插入图片描述

    运行示例:

    在这里插入图片描述

    为什么用CMake

    有人会问,我这只有一个cpp源文件,使用CMake后生成了那么多文件,那看起来好麻烦:
    在这里插入图片描述

    原因:在实际开发过程中,一个工程大致包含以下模块:
    最终生成的可执行文件、中间库文件、头文件、源文件、CMake生成的文件、测试文件、第三方库文件、CMake文件,自动化编译脚本文件等,这么多文件,如果编写makefile的话会更加麻烦,而使用CMake就很方便。

    在这里插入图片描述

    CMake常用的预定义变量

    PROJECT_NAME : 通过 project() 指定项目名称
    
    PROJECT_SOURCE_DIR : 工程的根目录
    
    PROJECT_BINARY_DIR : 执行 cmake 命令的目录
    
    CMAKE_CURRENT_SOURCE_DIR : 当前 CMakeList.txt 文件所在的目录
    
    CMAKE_CURRENT_BINARY_DIR : 编译目录,可使用 add subdirectory 来修改
    
    EXECUTABLE_OUTPUT_PATH : 二进制可执行文件输出位置
    
    LIBRARY_OUTPUT_PATH : 库文件输出位置
    
    BUILD_SHARED_LIBS : 默认的库编译方式 ( shared 或 static ) ,默认为 static
    
    CMAKE_C_FLAGS : 设置 C 编译选项
    
    CMAKE_CXX_FLAGS : 设置 C++ 编译选项
    
    CMAKE_CXX_FLAGS_DEBUG : 设置编译类型 Debug 时的编译选项
    
    CMAKE_CXX_FLAGS_RELEASE : 设置编译类型 Release 时的编译选项
    
    CMAKE_GENERATOR : 编译器名称
    
    CMAKE_COMMAND : CMake 可执行文件本身的全路径
    
    CMAKE_BUILD_TYPE : 工程编译生成的版本, Debug / Release
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    【第05天】给定一个整数 n 判断是否为素数 | 质数的判定与筛选
    [附源码]JAVA毕业设计抗击新冠疫情专题宣传网站(系统+LW)
    什么是线程池?
    什么蓝牙耳机好用不贵?好用不贵的蓝牙耳机推荐
    MCS:多元随机变量——离散随机变量
    自动化技术-图像识别
    许可分析 license分析 第十六章
    汇编实现点灯实验
    25.0、C语言——自定义数据类型_枚举和共用体
    day13 ts后端持久层框架(java转ts全栈/3R教室)
  • 原文地址:https://blog.csdn.net/m0_56257585/article/details/125892286