cmake编译运行

本文详细介绍了CMakeLists.txt文件的作用及基本语法,包括PROJECT指令定义工程名、SET指令设置变量、ADD_EXECUTABLE指令创建可执行文件。通过外部构建的方式,演示了如何使用cmake、make命令进行工程构建,并强调了外部编译的优势。同时提到了并行编译的实现方法,如使用`make -j4`提高构建效率。

首先建立文件main.c和CMakeLists.txt

然后分别输入:

#include <stdio.h>
int main()
{
printf("Hello World from t1 Main!\n");
return 0;
}
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

然后再运行

cmake .
make
./hello

解释:

CMakeLists.txt,这个文件是 cmake 的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt。

PROJECT(projectname [CXX] [C] [Java]):你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:<projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR

SET 指令可以用来显式的定义变量

比如我们用到的是 SET(SRC_LISTmain.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。用变量代替值,例子中定义SRC_LST代替后面的字符串

${}是用来引用变量,来对其取值,但是在IF循环中取值就不需要加这个符号

ADD_EXECUTABLE(hello main.c)中ADD_EXECUTABLE叫做指令,括号里面两个叫做参数,指令大小写不相关,参数大小写相关,但指令推荐使用大写。

如果一个文件的名字中间包括空格,比如ma in.c,那么使用SET(SRC_LIST main.c)这个语句的时候就要给main.c加上引号:SET(SRC_LIST "ma in.c")

cmake:是为了生成编译所需的Makefile以及其他中间文件

make:构建工程

外部构建:

上面的第一个cmake采用的是内部构建的方式,会在主文件夹内生成很多的临时文件,为了避免这个情况我们使用外部构建的方式:

1,首先,请清除 t1 目录中除 main.c CmakeLists.txt 之外的所有中间文件,最关键的是 CMakeCache.txt。
2,在 t1 目录中建立 build 目录,当然你也可以在任何地方建立 build 目录,不一定必须在工程目录中。
3,进入 build 目录,运行 cmake ..(注意,..代表父目录,因为父目录存在我们需要的CMakeLists.txt,如果你在其他地方建立了 build 目录,需要运行 cmake <工程的全路径>),查看一下 build 目录,就会发现了生成了编译需要的 Makefile 以及其他的中间文件.
4,运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。

上述过程就是所谓的 out-of-source 外部编译,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外部编译方式构建工程。这里需要特别注意的是:通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即
/backup/cmake/t1而 HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build

其他

make clean
即可对构建结果进行清理。

用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。

### 配置 CMake 项目在 VSCode 中编译运行 #### 创建 CMake 项目 打开命令面板(Ctrl+Shift+P)并运行 `CMake: Quick Start` 命令,输入项目名称,选择 C++ 作为项目语言。随后选择项目类型为可执行文件(Executable),以创建主入口源文件 `main.cpp`。CTest 和 CPack 等附加选项可根据需求选择或忽略。VSCode 会自动生成一个基础的 CMake 项目结构 [^2]。 #### 配置 CMakeLists.txt 文件 在项目根目录下找到 `CMakeLists.txt` 文件,并编辑其内容以配置整体项目信息和结构。例如: ```cmake # 设置 CMake 最低版本要求 cmake_minimum_required(VERSION 3.13) # 设置项目名称,并指定使用 C++ 语言 project(CppTest LANGUAGES CXX) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加子目录,包含 user 和 driver add_subdirectory(user) add_subdirectory(driver) ``` 此配置定义了项目的最低 CMake 版本、项目名称、使用的编程语言以及子目录结构 [^5]。 #### 编译运行项目 点击底部状态栏中的 CMake 工具栏,选择构建目标并触发编译流程。成功编译后,生成的可执行文件将位于构建目录中,通常为 `build/` 或 `out/` 子目录。可以通过终端直接运行该可执行文件,或者通过调试器启动调试会话 [^4]。 #### 调试 CMake 构建的项目 为了调试项目,在 `.vscode/launch.json` 文件中配置调试器参数,确保 `program` 字段指向正确的可执行文件路径,例如 `${workspaceFolder}/build/CppTest`。同时,设置 `cwd` 字段为 `${fileDir}` 以确保调试器使用正确的当前工作目录 [^1]。 #### 多文件编译与子目录支持 若项目包含多个子模块,需在每个子目录中添加独立的 `CMakeLists.txt` 文件,用于定义特定于该模块的构建规则。例如,在 `user` 目录下的 `CMakeLists.txt` 文件中可以声明头文件路径、源文件列表以及链接依赖项 [^5]。 #### 高级优化技巧 - **启用调试符号**:在 `CMakeLists.txt` 文件中添加 `set(CMAKE_BUILD_TYPE Debug)` 以启用调试符号,便于调试器识别代码行号。 - **跨平台支持**:利用 CMake 的跨平台特性,在不同操作系统上保持一致的构建逻辑,避免手动调整编译器参数。 - **集成测试框架**:如果选择了 CTest 支持,可以在 `CMakeLists.txt` 中添加测试用例,并通过 `ctest` 命令执行自动化测试 [^2]。 #### 版本控制与协作 对于团队协作开发,建议将 `CMakeLists.txt` 文件纳入版本控制系统(如 Git),以便成员间共享统一的构建配置。此外,定期更新 CMake 至最新稳定版,以获取新功能和性能改进 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值