1、CMake:安装与使用

1. CMake概述

CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。
而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,所以可以把CMake看成一款自动生成 Makefile的工具,其编译流程如下图:
在这里插入图片描述
CMake优点:

  1. 跨平台
  2. 能够管理大型项目
  3. 简化编译构建过程和编译过程
  4. 可扩展:可以为 cmake 编写特定功能的模块,扩充 cmake 功能

2. CMake安装

2.1 Windows系统

  1. 下载安装包:访问 CMake 官方下载页面,在 Windows 一栏中选择适合你系统的安装包(通常为 .msi 格式),例如 cmake-3.26.4-windows-x86_64.msi。
  2. 运行安装程序:双击下载好的安装包,按照安装向导的提示进行操作。在安装过程中,建议勾选 “Add CMake to the system PATH for all users” 选项,这样可以将 CMake 添加到系统的环境变量中,方便在命令行中使用。
  3. 验证安装:打开命令提示符(CMD)或 PowerShell,输入 cmake --version 命令,如果能正确显示 CMake 的版本信息,则说明安装成功。
    在这里插入图片描述

2.2 Linux 系统

  • Ubuntu/Debian 系统
  1. 打开终端,执行以下命令更新软件包列表:
sudo apt update
  1. 安装 CMake:在执行 sudo apt install cmake 命令时,你无需手动指定 cmake 的安装位置。apt 作为基于 Debian 系统(如 Ubuntu)的软件包管理工具,会自动处理 cmake 的安装路径。
sudo apt install cmake
  1. 安装完成后,使用 cmake --version 验证安装。

3. CMake简单使用

3.1 准备工作:可运行代码文件;CMake成功安装

在这里插入图片描述
文件的目录结构如下:
在这里插入图片描述

3.2 添加CMakeLists.txt 文件

在上述源文件所在目录下添加一个新文件 CMakeLists.txt,文件内容如下:

cmake_minimum_required(VERSION 3.10)
project(CALC)
add_executable(app add.cpp div.cpp main.cpp mult.cpp sub.cpp)
- cmake_minimum_required:指定使用的 cmake 的最低版本.可选,非必须,如果不加或者添加的版本过低(3.10以上)可能会有警告
- project:定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
- add_executable:定义工程会生成一个可执行程序

project指令

# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
       [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
       [DESCRIPTION <project-description-string>]
       [HOMEPAGE_URL <url-string>]
       [LANGUAGES <language-name>...])

add_executable指令

add_executable(可执行程序名 源文件名称)
- 这里的可执行程序名和project中的项目名没有任何关系
- 源文件名可以是一个也可以是多个,如有多个可用空格或;间隔
# 样式1
add_executable(app add.c div.c main.c mult.c sub.c)
# 样式2
add_executable(app add.c;div.c;main.c;mult.c;sub.c)

set_target_properties指令

set_target_properties 是一个用于设置目标(如可执行文件、库)属性的指令。通过该指令,你可以精确控制目标的各种特性,例如编译选项、链接选项、输出名称、版本号等。这对于多平台适配、版本管理以及自定义构建行为非常有用。

set_target_properties(<目标1> <目标2> ...
                      PROPERTIES <属性1> <1>
                                 <属性2> <2> ...)

常见属性及应用场景如下:

  1. 编译相关属性
# 设置 C++ 标准
set_target_properties(my_app PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
)

# 添加编译定义(相当于 -D 选项)
set_target_properties(my_lib PROPERTIES
    COMPILE_DEFINITIONS "DEBUG_MODE;USE_CUSTOM_ALLOCATOR"
)

# 设置编译选项
set_target_properties(my_app PROPERTIES
    COMPILE_OPTIONS "-Wall;-Wextra"
)
  1. 输出相关属性
# 修改输出名称(例如将默认的 my_app 改为 custom_name)
set_target_properties(my_app PROPERTIES
    OUTPUT_NAME "custom_name"
)

# 设置输出目录
set_target_properties(my_lib PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"  # 静态库(.a/.lib)
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"  # 动态库(.so/.dll)
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"  # 可执行文件
)
  1. 版本控制属性
# 设置共享库版本
set_target_properties(my_shared_lib PROPERTIES
    VERSION 1.2.3          # 完整版本号
    SOVERSION 1            # API 版本号
)
  1. 链接相关属性
# 设置链接选项
set_target_properties(my_app PROPERTIES
    LINK_FLAGS "-static-libstdc++"
)

# 强制使用静态链接
set_target_properties(my_app PROPERTIES
    LINK_SEARCH_START_STATIC ON
    LINK_SEARCH_END_STATIC ON
)
  1. 跨平台属性
# Windows 特定属性:创建无控制台的 GUI 应用
if(WIN32)
    set_target_properties(my_gui_app PROPERTIES
        WIN32_EXECUTABLE ON
    )
endif()

# macOS 特定属性:创建 Bundle 应用
if(APPLE)
    set_target_properties(my_app PROPERTIES
        MACOSX_BUNDLE ON
        MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/Info.plist"
    )
endif()

完整案例:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 添加可执行文件
add_executable(my_app main.cpp)

# 设置目标属性
set_target_properties(my_app PROPERTIES
    # 编译选项
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
    COMPILE_OPTIONS "$<$<CONFIG:DEBUG>:-O0;-g3>"  # 调试模式优化选项
    
    # 输出选项
    OUTPUT_NAME "myapp"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    
    # 版本信息
    VERSION ${PROJECT_VERSION}
    
    # 跨平台选项
    WIN32_EXECUTABLE $<BOOL:${WIN32}>  # Windows 下无控制台
    MACOSX_BUNDLE $<BOOL:${APPLE}>     # macOS 下为 Bundle
)

# 仅在 Linux 下设置额外属性
if(UNIX AND NOT APPLE)
    set_target_properties(my_app PROPERTIES
        LINK_FLAGS "-Wl,-rpath,'$ORIGIN/../lib'"  # 设置运行时库搜索路径
    )
endif()

set_property指令

set_target_properties:直接针对特定目标设置属性。
set_property:可以针对更广泛的作用域(如全局、目录、源文件等)设置属性,语法更灵活。

# 等效于 set_target_properties 的写法
set_property(TARGET my_app PROPERTY CXX_STANDARD 17)

# 针对所有目标设置属性
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "GLOBAL_DEFINE")

3.3 执行CMake命令

本项目在Windows中采用VS2019进行编译执行。
在这里插入图片描述

  • CMAKE_INSTALL_PREFIX 是 CMake 里的一个预定义变量,它用于指定软件安装的根目录。在使用 CMake 生成项目构建文件并进行编译安装时,所有安装的文件(像可执行文件、库文件、头文件等)都会被放置在以 CMAKE_INSTALL_PREFIX 为根的目录结构下。

执行Configure(CMake)命令后生成文件如图所示:
在这里插入图片描述
执行Generate(make)命令后生成文件如图所示,采用VS进行编译的需要进入VS中才能生成响应的exe执行文件。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.4 注意事项

  • 分而治之
    在这里插入图片描述
    在执行过程中最好将项目文件和项目生成文件分开存放。
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值