http://mrdede.com/?p=3754
https://blog.csdn.net/qq_45662588/article/details/118397000(全)
https://blog.csdn.net/zong596568821xp/article/details/114581446
https://blog.csdn.net/wzj_110/category_10357507.html (系列型)
CMake 生成静态库与动态库:https://blog.csdn.net/weixin_45004203/article/details/125256367
CMake一般语法特性:1)区分大小写
目录
一、命令
1.变量相关
set/unset
- 理解变量的三种类型:一般变量、缓存变量、环境变量
缓存变量: 不加FORCE标识,如果缓存中有变量,CMakeLists.txt里赋值会无效。
环境变量:1)全局性 2)永远无法持久性存储 3)可以在CMakeLists.txt中定义,也可以通过cmake -D传入。
http://t.zoukankan.com/narjaja-p-8351500.html
https://blog.csdn.net/m0_57845572/article/details/118400027
2.宏定义
https://blog.csdn.net/qq_36192498/article/details/126072223
https://blog.csdn.net/jinking01/article/details/109134089
3.基本语法
4.编译相关
-
option
https://blog.csdn.net/weixin_42108533/article/details/119119445
-
add_definitions
-
message (日志打印)
-
EXECUTE_PROCESS (执行指令)
5.工具类
时间
https://zhuanlan.zhihu.com/p/442889385
#获取年月日时分秒
string(TIMESTAMP COMPILE_TIME %Y%m%d%H%M%S)
#获取年份后两位,使用 %Y 获取完整年份
string(TIMESTAMP TIME_YEAR %y)
#获取月份
string(TIMESTAMP TIME_MONTH %m)
#获取日期
string(TIMESTAMP TIME_DAY %d)
message(STATUS "compile time:${COMPILE_TIME}")
6.工程结构相关
-
project
https://www.jianshu.com/p/cdd6e56c2422
通过${PROJECT_NAME}
可以拿到定义的工程名称
7.数据结构相关
8.库管理
link_xx与target_link_xx方法的区别:1)link_xx会把所有的目标链接库文件/头文件 2)target_link_xx指定目标链接到库文件/头文件,所以目标先要生成,target_link_xx要在add_executable之后执行。
-
生成静态库与动态库
-
include_directories(gcc -I 指定头文件目录)
https://www.jianshu.com/p/e7de3de1b0fa
等价于:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")
-
find_package (查找包)
https://www.jianshu.com/p/a0915895dbbc
https://www.xjx100.cn/news/212769.html?action=onClick -
link_directories (gcc -L 添加需要链接的库文件目录)
相当于 g++ 命令的 -L 选项的作用,也相当于环境变量中增加 LD_LIBRARY_PATH 的路径的作用
等价于:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs")
-
target_link_libraries (gcc -l 将目标文件与库进行链接)
将目标文件与库文件进行链接
https://www.cnblogs.com/wangshaowei/p/11324100.html
如果不指定目标参数,则报错:
Cannot specify link libraries for target xxx which is not built by this project.
-
find_library
https://www.jianshu.com/p/8a64c77343cb
https://blog.csdn.net/fengbingchun/article/details/127232175
不指定path,默认是寻找系统库。
HINTS, PATHS:指定除默认位置外要搜索的目录.HINTS与PATHS区别:HINTS是在搜索系统路径之前先搜索HINTS指定的路径,PATHS是先搜索系统路径,然后再搜索PATHS指定的路径。
9.头文件管理
-
include_directories与target_include_directories
target_include_directories 中的 PUBLIC,PRIVATE,INTERFACE
https://www.cnblogs.com/lidabo/p/16661031.html
https://blog.csdn.net/weixin_43862847/article/details/119762230
https://qa.1r1g.com/sf/ask/3467700631/
10.目标管理
-
if(NOT TARGET XX)
https://blog.csdn.net/qq_40715157/article/details/124692452 -
set_target_properties方法
https://blog.csdn.net/u013250861/article/details/127938863
11.文件管理
-
aux_source_directory
aux_source_directory(. SRC_LIST)
发现一个目录下所有的源代码文件,并将列表存储再一个变量中(不会递归遍历目录) -
file (自定义搜索)
https://blog.csdn.net/m0_66684841/article/details/123241561
12.安装打包
https://blog.csdn.net/youlinhuanyan/article/details/128762052
-
安装目录的前缀与后缀
https://blog.csdn.net/weixin_43940314/article/details/127836521
一般安装目录的默认前缀为${CMAKE_INSTALL_PREFIX}变量,值为/usr/local
-
指定路径的各种方法
https://blog.csdn.net/luo_lucky/article/details/127624923
**方法1**:修改cmake文件。在cmake文件中加入set(CMAKE_INSTALL_PREFIX "../install")。
**方法2**:修改cmake命令参数。cmake -DCMAKE_INSTALL_PREFIX="../install"。
**方法3**:使用ccmake调整CMAKE_INSTALL_PREFIX。
**方法4**(不推荐):使用make命令参数。make DESTDIR=absolute/path install。
注意:CMakeLists.txt里定义的INSTALL指令只是一个伪目标,make完毕之后需要执行make install
指令库及文件才会安装到指定目录 。
13.调试
在CMakeLists.txt中加上下面语句,否则文件无法断点。
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
14.生成静态链接可执行文件
SET(CMAKE_EXE_LINKER_FLAGS "-static")
15.shell交互
https://blog.csdn.net/shutdown_r_now/article/details/51184774
execute_process(COMMAND sh ../shell.sh)
,注意目录为cmake命令执行时所在的目录,包括shell里的目录。
二、函数
定义在调用的前面,区分大小写。
http://t.zoukankan.com/Braveliu-p-15577652.html
三、环境变量
常见环境变量整理:
1.编译相关
-
CMAKE_SYSTEM_NAME
CMAKE_SYSTEM_NAME 交叉编译的必设参数,只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量CMAKE_CROSSCOMPILING为true. -
CMAKE_BUILD_TYPE
设置项目的编译类型
https://blog.csdn.net/qq_43232373/article/details/124306964 -
CMAKE_CXX_STANDARD
设置c++标准
https://zhuanlan.zhihu.com/p/500002865 -
设置gcc与g++参数
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
2.工程相关
https://blog.csdn.net/weixin_45824067/article/details/130801374
-
PROJECT_SOURCE_DIR
工程源码根目录 -
CMAKE_BINARY_DIR
执行cmake时的目录
四、高级用法
- configure_file
https://zhuanlan.zhihu.com/p/436923370
通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/C++ 中可识别的宏定义,然后存入另一个文件中(一般是头文件.h)。
五、常见编译错误
-
make[2]: *** 没有规则可制作目标“/home/xinyi/android/code/Task5-rom_app_update/libs/libhttplib.a”,由“test” 需求。 停止。
找不到库。
link_libraries(/home/xinyi/android/code/Task5-rom_app_update/libs/libhttplib.a)
项目名改了,但是由于是绝对路径,没有及时更新。 -
Cannot specify link libraries for target " XXX XXX " which is not built by this project.
target_link_libraries没有指定目标文件 -
undefined reference to `BaseEntity::toJson[abi:cxx11]()'
add_executable没有包含引用到的源码就会报这个错误
0 条评论