收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我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 功能。

#### 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年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
91768266)]
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!