cmake编译运行

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

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

首先建立文件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资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值