CMake良心教程(1)手把手教你入门!

目录

一.CMake是什么?有什么用?

二.环境配置

2.1CMake安装

 2.2MinWG安装

三.构建最小项目

3.1项目的构建

3.2外部构建与内部构建

四.CMakeLists.txt语法介绍

4.1 project关键字

4.2 set 与 PROJECT_NAME

4.3 MESSAGE关键字

4.4 ADD_EXECUTABLE关键字

五.语法的基本原则

六.语法注意事项


一.CMake是什么?有什么用?

如果想要真正的了解一个人,那我们第一眼看到的肯定是人的轮廓。知识也是同理,所以我会先介绍CMake的大体轮廓。

想要了解CMake是干什么的,我们首先要知道一个源文件的编译过程。

  • 1.用编辑器编写源代码,如.c文件。
  • 2.用编译器编译代码生成目标文件,如.o。
  • 3.用链接器连接目标代码生成可执行文件,如.exe。

但如果源文件太多,一个一个编译那得多麻烦啊?于是人们想到,为啥不设计一种类似批处理的程序,来批处理编译源文件呢?

于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。

综上我们现在可以把CMake看作是用于产生Makefiles文件的工具。

二.环境配置

我的环境是 Windows10 + CMake + MinGW,MinGW 就是 GCC 的 Windows 移植版本。所以本文就以我的环境来进行讲解。

2.1CMake安装

安装链接:CMake官网安装

根据个人需求选择适当的版本进行下载,其中包含许多不同版本。

【重要提示】请确认你的计算机操作系统类型,以及是32位还是64位。(附注:x86表示32位系统;x64表示64位系统)

下载完成后,双击进行安装。 

下载完成后,单击“Next”按钮,在下图中勾选“I accept the terms in the License
Agreement”复选框接受许可协议:

选中“Add CMake to the system PATH for all users”单选按钮添加系统路径变量。也可以同时勾选“CreateCMakeDesktopIcon”复选框,以便在安装完成后在桌面上创建CMake的快捷方式图标。

点击Install进行安装。

安装完成后,进入Windows系统环境变量设置对话框,如下图所示。可以看到,由于刚才的设置CMake已经自动将其安装路径“D:\Program Files\CMake\bin” 写入环境变量Path中。

 重启电脑后,打开cmd黑窗,输入cmake,能够显示cmake的一些信息即为安装成功,如下图:

 2.2MinWG安装

下载地址:MinWG官网下载

点击上面链接,进入下图1后将页面往下滑到图2区域,点击所需离线包名称:

(Version: 指的是 gcc 的版本,如果没有特殊的需求,一般选择最高的版本号即可。最高版本是8.1.0 ,选中它即可

选默认

Architechture:电脑系统是 64位的,选择 x86_64;如果是 32位 系统,则选择 i686

选x86_64

Threads:如果是 Windows ,选择 win32 ,如果是 Linux、Unix、Mac OS 等其他操作系统要选择 posix

选win32

Exception:seh 是新发明的,而 sjlj 则是古老的。seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。

建议64位操作系统选择seh

选seh)

,然后就会弹出图3所示对话框,保存下载即可。离线包大约50MB(解压后500MB左右),下载一般只需半个小时,具体视乎网速情况而定。

 

 下载完成解压后的界面是这样的

 环境变量配置:

设置->搜索高级系统设置->环境变量->path->新建,将MinGW-w64包目录下bin文件夹的全路径粘贴到后面,bin的后面有无斜杠均可,如下图:

 

 

 

 至此环境就安装完毕。

三.构建最小项目

3.1项目的构建

最基本的项目是将一个源代码文件生成可执行文件。对于这么简单的项目,只需要一个三行的 CMakeLists.txt 文件即可,这是本篇教程的起点。在Test目录中创建一个 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.15)

project(test)

add_executable(Test test.c)

  1. cmake_minimum_required(VERSION 3.15): 这一行指定了编译这个项目所需的CMake的最低版本。在这个例子中,这个项目需要3.15或者更高版本的CMake。

  2. project(test): 这一行定义了项目的名字,这里的项目名字是“test”。CMake将会创建一些变量,比如test_SOURCE_DIRtest_BINARY_DIR,以便在项目内部使用。

  3. add_executable(Test test.c): 这一行告诉CMake创建一个叫做“Test”的可执行文件,源文件是test.c。CMake将自动找到正确的编译器(在这种情况下,是C编译器)来编译test.c,然后链接生成名为“Test”的可执行文件。

注意,此示例在 CMakeLists.txt 文件中使用小写命令。CMake 支持大写、小写和混合大小写命令。

test.c文件在 Test 目录中 :

#include<stdio.h>
int main(){
printf("hello dxm");
return 0;
}

现在就可以构建和运行我们的项目了,就是先运行 cmake 命令来构建项目,然后使用你选择的编译工具进行编译。

先从命令行进入到Test目录,并创建一个构建目录 build,接下来,进入 build 目录并运行 CMake 来配置项目,并生成构建系统:

依次解释:

1. cd C:\Users\86137\Desktop\Test 目的是切换到Test目录下

2.mkdir build 创建一个构建目录 build

3.cd build 进入 build 目录

4.cmake -G "MinGW Makefiles" ..  这个命令的意思是在当前目录生成一个用于MinGW的Makefile,它会根据位于上级目录的源代码来设置Makefile的内容。然后你就可以使用MinGW的make命令来编译你的项目了。

5.cmake --build . --build 指定编译生成的文件存放目录,其中就包括可执行文件,. 表示存放到当前目录。

6.Test.exe 可以看到执行出了正确结果

此时目录结构为:

Test/
    build/
    CMakeLists.txt
    test.cpp

3.2外部构建与内部构建

这里创建了一个 build 目录存放编译产物,可以避免编译产物与代码文件混在一起,这种叫做外部构建。

还有一种内部构建,即直接在项目根目录下进行构建系统与编译,这时构建和编译命令就更改为:

cmake -G"MinGW Makefiles" .
cmake --build .

内部构建会使得项目文件很混乱,一般直接用外部构建即可。 到这里我们的第一个CMake项目就完成了。

四.CMakeLists.txt语法介绍

4.1 project关键字

  • 用来设置项目的名字和支持的语言,默认支持所有语言
project(demo)
project(demo CXX) 

第二行代表指定工程名为demo,支持语言是C++ 

最好写上,它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。

4.2 set 与 PROJECT_NAME

这是上文的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.15)

project(test)

add_executable(Test test.c)

指定了项目名后,后面可能会有多个地方用到这个项目名,如果更改了这个名字,就要改多个地方,比较麻烦,那么可以使用 PROJECT_NAME 来表示项目名。

add_executable(${PROJECT_NAME} test.cpp)

生成可执行文件需要指定相关的源文件,如果有多个,那么就用空格隔开,比如:

add_executable(${PROJECT_NAME} a.cpp b.cpp c.cpp)

我们也可以用一个变量来表示这多个源文件:

set(SRC_LIST a.cpp b.cpp c.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})

 set 命令指定 SRC_LIST 变量来表示多个源文件,用 ${var_name} 获取变量的值。

  • 设置变量

1.set 直接设置变量的值

set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})

2. set 追加设置变量的值

set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})

于是原来的 CMakeLists.txt 文件就可以变成如下所示:

cmake_minimum_required(VERSION 3.15)

project(Test)

SET(SRC_LIST test.cpp)

add_executable(${PROJECT_NAME} ${SRC_LIST})

这样看起来就很简洁。

4.3 MESSAGE关键字

message关键字用于向用户显示一些消息。这可能是一些调试信息、警告或者错误信息。基本的使用格式如下:

message([<mode>] "message text" ...)

其中<mode>用于指定消息的类型,可以是以下几种:

  • (none): 等同于 STATUS,这是默认选项,消息会打印到 stderr。
  • STATUS: 普通信息,打印出一些状态消息,例如提示用户某个操作正在进行。该消息会被 CMake GUI 和 ctest -S 脚本捕获。
  • WARNING: 警告信息,但不会停止处理。
  • AUTHOR_WARNING: 类似于 WARNING,但可以通过设置 CMAKE_SUPPRESS_DEVELOPER_WARNINGS 变量来抑制,以避免对最终用户的干扰。
  • SEND_ERROR: 类似于 ERROR,但处理过程会继续进行。它会在 CMake 运行过程中立即显示错误消息,并将错误标记在生成过程中。
  • FATAL_ERROR: 严重错误信息,遇到此类信息将会停止所有的 CMake 运行过程。

以下是几个 message 的示例:

message(STATUS "This is a status message. It is used for providing information.")
message(WARNING "This is a warning message. It can be used to convey important information.")
message(FATAL_ERROR "This is a fatal error. It will stop the processing of CMake.")

这些信息可以在你运行 cmake 命令时在命令行中看到,帮助你了解你的配置文件的状态或者是出现的错误。

4.4 ADD_EXECUTABLE关键字

在CMake中,ADD_EXECUTABLE是一个关键指令,它被用来从指定的源代码文件创建一个可执行文件。

ADD_EXECUTABLE的基本语法如下:

ADD_EXECUTABLE(executable_name source1 source2 ... sourceN)

在这个语法中:

  • executable_name是你希望创建的可执行文件的名称。这个名字不包含任何后缀,例如“.exe”。CMake会根据目标系统自动添加适当的后缀。
  • source1, source2, ..., sourceN是你希望包含在可执行文件中的源代码文件。这些文件可以是C,C++或者其他CMake支持的编程语言的源代码文件。

例如,如果你有一个C++项目,其中包含两个源文件main.cppfunctions.cpp,并且你想将这个项目编译成名为myProgram的可执行文件,那么你可以使用以下的CMake指令:

ADD_EXECUTABLE(myProgram main.cpp functions.cpp)

请注意,ADD_EXECUTABLE只会创建可执行文件的构建规则,但并不会真正执行编译。实际的编译过程会在你运行make或者与你的构建系统相对应的命令时进行。

五.语法的基本原则

  • 变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
  • 指令(参数1 参数2...)参数使用括弧括起,参数之间用空格或分号分开。
  • 指令是大小写无关的,参数和变量是大小写有关的。但推荐全部使用大写。

六.语法注意事项

  • SET(SRC_LIST main.cpp) 可以写成SET(SRC_LIST "main.cpp") ,如果源文件名字中含有空格,就必须要加双引号。
  • ADD_EXECUTABLE(hello main)后缀可以不写,他会自动去找.c和.cpp,最好不要这么写,容易产生误导。 

注:本节先到这里,下一节进入实操,让你的代码看起来更像一个工程。 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面为您介绍 CMake 中的 macro 和 function。 ## 1. macro macro 是一种 CMake 的宏定义机制,可以将一组 CMake 命令封装起来,用一个名字来调用,从而简化 CMakeLists.txt 中的代码量。 macro 的定义格式如下: ``` macro(macro_name [arg1 [arg2 [arg3 ...]]) # command1 # command2 # ... endmacro() ``` 其中,macro_name 是宏的名称,arg1、arg2、arg3...是宏的参数列表,可以有 0 至多个参数。 下面是一个简单的例子,定义了一个名为 print_info 的宏,该宏接受两个参数,分别是 name 和 age,然后输出一条信息: ``` macro(print_info name age) message("Name: ${name}, Age: ${age}") endmacro() print_info("Alice" 18) ``` 执行上述代码后,输出结果为: ``` Name: Alice, Age: 18 ``` ## 2. function function 与 macro 的作用类似,也是将一组 CMake 命令封装起来,用一个名字来调用,但 function 有明确的返回值。function 的定义格式如下: ``` function(func_name [arg1 [arg2 [arg3 ...]]) # command1 # command2 # ... return(value) endfunction() ``` 其中,func_name 是函数的名称,arg1、arg2、arg3...是函数的参数列表,可以有 0 至多个参数。value 是函数的返回值。 下面是一个简单的例子,定义了一个名为 add 的函数,该函数接受两个参数,分别是 a 和 b,然后返回它们的和: ``` function(add a b) set(result ${a}+${b}) return(${result}) endfunction() set(sum 0) math(EXPR sum "${sum} + $(add(1 2))") message("Sum: ${sum}") ``` 执行上述代码后,输出结果为: ``` Sum: 3 ``` 在 function 中,我们使用 set 命令定义了一个变量 result,然后用 return 返回了这个变量的值。在调用 add 函数时,我们使用了 $() 将函数调用结果作为表达式的一部分,然后再用 math 命令计算出 sum 的值。 以上就是 CMake 中 macro 和 function 的介绍,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值