cmake详细教程(概念版)_cmakelists怎么用

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  ${PROJECT_SOURCE_DIR}/lib/*.cpp

)

设置变量,给文件名/路径名或其他字符串起别名,用${变量}获取变量内容

set(变量 文件名/路径/…)

添加编译选项FOO BAR

add_definitions定义宏,但是这种定义方式无法给宏具体值 等价C语言中的#define MG_ENABLE_OPENSSL

add_definitions(-DFOO -DBAR …)

add_compile_definitions定义宏,这种方式可以给宏具体值,但是这个指令只要高版本的cmake支持 等价C语言中 #define MG_ENABLE_OPENSSL 1

add_compile_definitions(MG_ENABLE_OPENSSL=1)

打印消息

message(消息)

编译子文件夹的CMakeLists.txt

add_subdirectory(子文件夹名称)

将.cpp/.c/.cc文件生成.a静态库

注意,库文件名称通常为libxxx.so,在这里只要写xxx即可

add_library(库文件名称 STATIC 文件)

将.cpp/.c/.cc文件生成可执行文件

add_executable(可执行文件名称 文件)

规定.h头文件路径

include_directories(路径)

规定.so/.a库文件路径

link_directories(路径)

设置编译选项及默认值

option(TEST_DEBUG “option for debug” OFF)

对add_library或add_executable生成的文件进行链接操作

注意,库文件名称通常为libxxx.so,在这里只要写xxx即可

target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)


#### 1.2 `CMakeLists.txt`文件结构



project(xxx) #必须

add_subdirectory(子文件夹名称) #父目录必须,子目录不必

add_library(库文件名称 STATIC 文件) #通常子目录(二选一)
add_executable(可执行文件名称 文件) #通常父目录(二选一)

include_directories(路径) #必须
link_directories(路径) #必须

target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称) #必须


#### 1.3 `CMakeLists.txt`示例



指定cmake版本

cmake_minimum_required(VERSION 3.0)

设置项目名称

project(SOLIDERFIRE)

添加编译参数

set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -g -O2 -Wall”)

设置代码构建级别为 Debug 方式

set(CMAKE_BUILD_TYPE Debug)

包含目录

include_directories(${CMAKE_SOURCE_DIR}/include)

编译

add_executable(a.out main.cpp src/Gun.cpp src/Solider.cpp)


#### 1.4 build文件夹


为了简单起见,cmake 采用 `out-of-source` 方式构建(即生成中间产物与源代码分离),即创建 build 文件夹用于编译。



mkdir build
cd build

cmake工具生成CMakeLists.txt文件

cmake …

多进程编译

make编译根据CMakeLists.txt文件进行编译

make -j$(nproc)



|
±-- main.c
±-- CMakeLists.txt
|
/–+ build/
|
±-- hello(exec)


### 2. CMake工具


#### 2.1 CMake工具简介


CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile 或者 project 文件,CMake 的配置文件取名为 `CMakeLists.txt`。也就是在 `CMakeLists.txt` 这个文件中写 cmake 代码。 简单理解,**cmake 就是将多个 cpp、hpp 文件组合构建为一个大工程的语言**。


cmake 编写的过程实际上是编程的过程,每个项目使用一个 `CMakeLists.txt`(每个目录一个),使用的是 cmake 语法。


#### 2.2 CMake工具优势


* **跨平台**,并可以生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile;在苹果平台可以生成 Xcode;在Windows 平台,可以生成 MSVC 的工程文件。
* **能够管理大型项目**。
* **简化编译构建过程和编译过程**。cmake 的工具链非常简单:cmake + make。
* **可扩展**,可以为 cmake 编写特定功能的模块,扩展 cmake 功能。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/46651714f7af47d7975a60f48968280a.png#pic_center)


#### 2.3 CMake跨平台


cmake中有一个概念叫 cmake generator生成器,cmake生成器支持不同的生成器,例如:Makefile系列、Ninja系列等。要产生Ninja,加上 -G Ninja 即可:



cmake -G Ninja


但cmake提供了一个统一的命令接口,不管底层是啥,直接用以下指令即可:



cmake --build .


简单理解,不管你用什么生成器,cmake都能正确构建,实现真正的跨平台。


#### 2.4 cmake编译



cmake --build . --config Release --target check


#### 2.5 make编译



多线程编译

make -j4 -l4


**参数解释**


* `-j4`,j 是 job 的意思,代表允许 4 个编译命令同时进行,一般是以 CPU  
 的核心数目的两倍为宜;
* `-l4`,l 是 load-average 的意思,代表系统加载的任务数,数目一般与-j 的数  
 目保持一致。


## 三、常用指令


### cmake clean清理


**问题引入**


`make clean`可以删除makefile生成的所有文件,对于CMake也有同样的需求,删除 `cmake_install.cmake`和 `CMakeLists.txt` 等文件,以及 `CMakeFiles` 文件夹。



cmake --build --target clean

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

91768266)]

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值