CMake应用
前言
当我们完成代码时,我们的代码是如何工作的?
源代码到可执行文件的过程可以分为:预处理 -> 编译 -> 汇编 -> 链接。
- 预处理(Preprocessing):在这个阶段,预处理器会处理所有以#开头的指令(如#include、#define、#if等)。例如,#include指令会将头文件的内容插入到源文件中,#define会将宏展开。
- 编译(Compilation): 预处理后的源代码会被送入编译器。编译器将其转化为汇编语言代码,或者在某些系统中直接转化为中间代码。编译器会进行语法检查、语义分析、优化等工作。在这个阶段,编译器生成一个目标文件(通常以.o或.obj为扩展名)。
- 汇编(Assembly): 编译器生成的汇编语言代码会被汇编器转化为机器代码。这个过程会生成一个目标文件(.o 或 .obj 文件),这个文件是机器代码的二进制格式。
- 链接(Linking): 链接器负责将一个或多个目标文件和相关的库(如标准库或其他第三方库)链接成一个单一的可执行文件。在这个阶段,链接器会解决符号(如函数、变量等)的引用,并将它们正确地映射到内存地址。如果程序引用了标准库或其他外部库,链接器也会将这些库的代码加到最终的可执行文件中。
在这个过程中,g++(GNU编译器)等工具通常会在后台自动执行这些步骤。
所以CMake是什么?可以解决什么问题?
CMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个函数库。
无论是在 Linux、Windows还是macOS,开发者只需要维护一套CMakeLists.txt配置文件,而CMake会根据平台的不同生成适合的构建脚本(例如 Makefile、Visual Studio项目文件等)。这使得跨平台开发变得非常简单。
CMake通过使用简单的配置文件 CMakeLists.txt,自动生成不同平台的构建文件(如Makefile、Ninja 构建文件、Visual Studio工程文件等),简化了项目的编译和构建过程。
CMake本身不是构建工具,而是生成构建系统的工具,它生成的构建系统可以使用不同的编译器和工具链。
一、在windows平台上使用CMake与VS Code编译C++源码
1.1 安装必备工具
- 安装VS Code
- 安装VS Code插件,CMake Tools(用于支持 CMake 项目配置和生成)
- 安装 CMake,下载适合自己的版本;安装后,打开命令行输入
cmake --version
来确认是否安装成功,确保将CMake添加到系统路径(安装的时候勾选一下就可以啦)。
1.2 配置CMake项目
- 创建C++项目结构,假设你有一个简单的C++项目,目录结构可能如下:
my_project/ ├── CMakeLists.txt ├── main.cpp
- 编辑 CMakeLists.txt 文件 在项目根目录创建 CMakeLists.txt 文件,内容可以简单如下:
cmake_minimum_required(VERSION 3.10) project(MyApp) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) # 添加源文件 add_executable(MyApp main.cpp)
#include
- 编辑 main.cpp 文件 在项目根目录创建 main.cpp 文件,内容可以简单如下:
int main() { std::cout << "Hello, CMake and VS Code!" << std::endl; return 0; }
1.3 配置VS Code
配置VS Code步骤如下:
- 打开你刚刚创建的C++项目文件夹。
- 生成构建文件,按Ctrl+Shift+P打开命令面板,输入CMake: Configure,选择自己需要的编译器
- 配置完成后,你可以开始构建项目:按Ctrl+Shift+P打开命令面板,输入CMake: Build,选择构建目标进行编译;或者直接选择点击状态左下角齿轮都可以。
- 这时CMake会在项目目录下创建一个build目录,并将编译的中间文件和最终的可执行文件放在那里。
- 如果需要调试,直接点击状态栏小虫子进行debug
- 如果需要清理构建目录、重新构建,可以使用鼠标右击CMakeLists.txt进行操作
二、CMakeLists.txt文件结构及语法
参考菜鸟Cmake教程-Cmake语法,根据需要往上堆就可以了
cmake_minimum_required(VERSION 3.10)
project(MyApp)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
# 添加头文件搜索路径
include_directories(include)
# 查找Boost库,如果 Boost 没有找到,CMake 会报错并停止构建。
# 如果找到了 Boost,它会设置一些 CMake 变量,例如 Boost_INCLUDE_DIRS 和 Boost_LIBRARIES,这些可以用来配置包含目录和链接库。
find_package(Boost REQUIRED)
# 添加源文件
set(SOURCES src/main.cpp src/foo.cpp)
# 生成可执行文件
add_executable(MyApp ${SOURCES})
# 链接 Boost 库
target_link_libraries(MyApp Boost::Boost)
# 安装规则
install(TARGETS MyApp DESTINATION bin)
三、常见问题&解决办法
3.1 CMake 可执行文件错误: “”。请检查以确保它已安装
这个问题出现在第二章 1.3节 配置VS Code过程中的第三个步骤的操作中发生
解决办法:
- 找到CMake Tool扩展,点击管理
- 在CMake Tool扩展的配置中,找到Cmake: Cmake Path
- 将之前安装好的Cmake.exe的路径填入即可