在 windows 下安装并调试 CMake

本文介绍了CMake的基本使用,包括安装、初次构建案例、更多功能如定义变量、搜索文件、指定头文件目录、制作库文件(动态和静态)、链接、打印日志、字符串操作、自定义宏以及嵌套操作。最后提供了参考文档链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

CMake是一个跨平台的开源工具,用于管理软件项目的构建过程。它不直接构建软件,而是生成用于特定平台或编译器的构建文件(如Makefile或Visual Studio项目文件),然后利用这些文件来实际构建软件。

简单的说:我用CMake可以把c++、python、java、等等语言,打包成.exe或者.app执行文件。
在这里插入图片描述

二、初次尝试

CMake通常用于构建C++项目,但它也可以与其他语言一起使用,包括Python。

1、安装

下载地址:https://cmake.org/files/

安装是注意添加环境变量如下图:
在这里插入图片描述
查看是否安装成功cmake --version
在这里插入图片描述

2、初次构建案例

先创建C++执行代码如下:代码地址 github
在这里插入图片描述
CMakeLists.txt 是用于配置 CMake 构建系统的文件,它描述了项目的组织结构、依赖关系和构建规则,简单的理解就是配置文件。

1、进入build目录,编译c++代码

mkdir build
cd build
# cmake 后面跟的是CMakeLists.txt文件所在的目录
cmake ..

2、构建可执行文件,--config Release不写默认构建debug模式

cmake --build . --config Release

3、构建好的目录效果
在这里插入图片描述
4、执行效果
在这里插入图片描述

三、更多用法

1、定义变量

这里通过set命令,创建新的SRC变量并给它赋值。

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC
set(SRC add.cpp div.cpp mult.cpp main.cpp sub.cpp)
# 设置构建输出目录
set(EXECUTABLE_OUTPUT_PATH  E:/code/js_reverse/CMake构建/v1/bulid/aa/bb/cc)
# 设置C++ 标准版本
set(CMAKE_CXX_STANDARD 11)
# 得到变量 ${SRC}并构建exe文件
add_executable(app ${SRC})

2、搜索文件

如何通过搜索文件实现变量SRC的赋值

PROJECT_SOURCE_DIR 实现

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC PROJECT_SOURCE_DIR 表示命令行执行cmake .. 后面的..
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)
# 得到变量 ${SRC}并构建exe文件
add_executable(app ${SRC})

CMAKE_CURRENT_BINARY_DIR实现(不推荐使用)

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC CMAKE_CURRENT_BINARY_DIR 表示命令 CMakeLists.txt 所在的目录
file(GLOB SRC ${CMAKE_CURRENT_BINARY_DIR}/*.cpp)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)
# 得到变量 ${SRC}并构建exe文件
add_executable(app ${SRC})

3、指定头文件目录

修改项目目录,让项目更加方便管理
在这里插入图片描述
CMakeLists.txt 编写内容

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC CMAKE_CURRENT_BINARY_DIR 表示命令 CMakeLists.txt 所在的目录
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
# 指定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)
# 得到变量 ${SRC}并构建exe文件
add_executable(app ${SRC})

4、通过CMake制作库文件

动态库和静态库文件区别

window下
动态库:library.dll
静态库:library.lib
liunx下
动态库:library.so
静态库:library.a

动态库适合于多个程序共享、节省系统资源和方便更新维护的场景,而静态库适合于需要独立运行、性能要求高或者依赖库版本稳定的场景。

CMakeLists.txt 编写内容

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC CMAKE_CURRENT_BINARY_DIR 表示命令 CMakeLists.txt 所在的目录
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
# 指定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)
# 指定库路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libr)
# 生成动态库
#add_library(library SHARED ${SRC})
# 生成静态库
add_library(library STATIC ${SRC})

执行命令

cmake --build . --config Release

执行效果
在这里插入图片描述

5、链接静态库

语法:

link_libraries(library_name1 library_name2 ...)

CMakeLists.txt 案例编写

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC CMAKE_CURRENT_BINARY_DIR 表示命令 CMakeLists.txt 所在的目录
file(GLOB SRC ${PROJECT_SOURCE_DIR}/main.cpp)
# 指定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)
# 链接 library 是库名称
link_libraries(library)
# 如果是自定义库就需要 定义路径
link_directories(${PROJECT_SOURCE_DIR}/lib1/Debug)
# 得到变量 ${SRC}并构建exe文件
add_executable(app ${SRC})

6、链接动态库

语法:

target_link_libraries(target_name PRIVATE|PUBLIC|INTERFACE library_name1 library_name2 ...)

CMakeLists.txt 案例编写

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC CMAKE_CURRENT_BINARY_DIR 表示命令 CMakeLists.txt 所在的目录
file(GLOB SRC ${PROJECT_SOURCE_DIR}/main.cpp)
# 指定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)

# 如果是自定义库就需要 定义路径
link_directories(${PROJECT_SOURCE_DIR}/lib1/Debug)
# 得到变量 ${SRC}并构建exe文件
add_executable(app ${SRC})
# 链接动态库
target_link_libraries(app PUBLIC library)

7、打印日志

FATAL_ERROR 错误抛出程序停止

message(FATAL_ERROR "2222222222222222")

STATUS 正常日志输出

message(STATUS "2222222222222222")

CMakeLists.txt 案例编写

# cmake版本
cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)
# 设置变量SRC CMAKE_CURRENT_BINARY_DIR 表示命令 CMakeLists.txt 所在的目录
file(GLOB SRC ${PROJECT_SOURCE_DIR}/main.cpp)
# 指定头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)
#  C++ 标准版本
set(CMAKE_CXX_STANDARD 11)

# 如果是自定义库就需要 定义路径
link_directories(${PROJECT_SOURCE_DIR}/lib1/Debug)
message(STATUS "111111111111111")
add_executable(app ${SRC})
# FATAL_ERROR 错误抛出 程序停止
#message(FATAL_ERROR "2222222222222222")
# 链接动态库
target_link_libraries(app PUBLIC library)
# STATUS 正常日志输出
message(STATUS "55555555555555")

8、字符串操作

多个变量拼接后底层是由;区分

cmake_minimum_required(VERSION 3.2)
# 项目名称
project(test)

file(GLOB SRC ${PROJECT_SOURCE_DIR}/main.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)

set(aaa 1)
message(${aaa})
# 拼接字符串
set(bbb ${aaa} 2)
message(${bbb})
# 追加字符串
list(APPEND bbb 3)
message(${bbb})
# 删除字符串
list(REMOVE_ITEM bbb 1)
message(${bbb})

效果:

1
12
123
23

除了 list(APPEND)list(REMOVE_ITEM),CMake 还提供了其他用于操作列表的命令和函数。以下是其中一些常用的:

创建列表:
通过 set 命令直接创建列表变量

set(<list_variable> value1 value2 ...)

获取列表的长度,并将结果存储在输出变量中。

list(LENGTH <list_variable> <output_variable>)

获取列表中指定索引位置的元素,并将结果存储在输出变量中。

list(GET <list_variable> <index> <output_variable>)

向列表变量添加一个或多个元素。

list(APPEND <list_variable> value1 value2 ...)

从列表中移除一个或多个特定的元素。

list(REMOVE_ITEM <list_variable> value1 value2 ...)

将列表中的元素连接成一个字符串,并将结果存储在输出变量中。

list(JOIN <list_variable> <glue> <output_variable>)

反转列表中的元素顺序。

list(REVERSE <list_variable>)

查找列表中指定值的索引,并将结果存储在输出变量中。

list(FIND <list_variable> value <output_variable>)

9、自定义宏

c++ 案例代码

#include <stdio.h>
#define NUMBER 3

int main()
{
    int a = 10;
#ifdef DEBUG
    printf("111111111111\n");
#endif
    for(int i=0; i<NUMBER; ++i)
    {
        printf("hello, GCC|||\n");
    }
    return 0;
}

宏的定义

cmake_minimum_required(VERSION 3.2)
project(test)
file(GLOB SRC ${PROJECT_SOURCE_DIR}/h.cpp)
# 定义宏DEBUG 类似定义变量
add_definitions(-DDEBUG)
add_executable(app ${SRC})

打印效果:
在这里插入图片描述
应用场景:可以用做的log信息打印开关

10、嵌套操作

在编程中,CMake 是一个流行的跨平台构建系统生成工具,它用于自动生成针对不同操作系统和编译器的构建文件。嵌套的 CMake 项目通常指的是一个 CMake 项目包含了另一个或多个 CMake 项目的情况。

以下是一个简单的嵌套 CMake 项目的示例结构:

project_root/
│
├── CMakeLists.txt         # 主项目的 CMake 配置文件
│
├── submodule_1/           # 第一个子模块
│   ├── CMakeLists.txt     # 子模块 1 的 CMake 配置文件
│   ├── source_files.cpp   # 子模块 1 的源文件
│   └── header_files.h     # 子模块 1 的头文件
│
├── submodule_2/           # 第二个子模块
│   ├── CMakeLists.txt     # 子模块 2 的 CMake 配置文件
│   ├── source_files.cpp   # 子模块 2 的源文件
│   └── header_files.h     # 子模块 2 的头文件
│
└── ...

以下是一个简单的示例主项目的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 包含第一个子模块
add_subdirectory(submodule_1)

# 包含第二个子模块
add_subdirectory(submodule_2)

# 添加主项目的源文件
add_executable(MyExecutable main.cpp)

# 链接子模块的库到主项目
target_link_libraries(MyExecutable Submodule1Library Submodule2Library)

四、参考文档

https://subingwen.cn/cmake/CMake-advanced/
https://subingwen.cn/cmake/CMake-primer/

### 使用CMakeWindows平台上的详细教程 #### 一、安装CMake 为了能够在Windows上使用CMake,首先需要下载安装最新版本的CMake。可以从官方网站获取安装程序,按照提示完成安装过程[^2]。 #### 二、创建项目结构 建立一个新的文件夹作为项目的根目录,在此目录内创建`src`子文件夹用来放置源代码文件;同时在此处还需要准备一个名为`build`的新建文件夹专门用于存放编译过程中产生的临时文件以及最终生成的目标文件[^1]。 #### 三、编写CMakeLists.txt 在一个文本编辑器中打开位于项目根目录下的`CMakeLists.txt`文件,定义最小化的CMake脚本如下所示: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject) set(CMAKE_CXX_STANDARD 17) add_executable(${PROJECT_NAME} src/main.cpp) ``` 这段简单的例子指定了最低所需的CMake版本号、工程名称、使用的C++标准以及要构建的应用程序入口点所在的源码位置。 #### 四、配置与生成构建系统 通过命令行工具进入之前提到过的`build`文件夹路径下执行下面两条指令之一来进行具体操作: - 对于希望得到Ninja格式的makefile,则运行 `cmake .. -G "Ninja"`; - 如果想要获得适用于Visual Studio 2019的工作空间,则应输入 `cmake .. -G "Visual Studio 16 2019"` 这里假设读者已经正确设置了环境变量使得可以在任何地方调用`cmake.exe`而无需提供完整路径。 #### 五、启动实际编译流程 一旦成功完成了上述步骤之后就可以继续下一步骤了——即真正意义上的“Build”。对于采用ninja作为后台驱动的情况只需简单地键入`ninja`即可触发整个编译链路直至产出可执行文件;而对于选择了visual studio方案的情形则需借助IDE内部集成的功能按钮来达成相同目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是花臂不花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值