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.编译相关

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.工程结构相关

7.数据结构相关

8.库管理

link_xx与target_link_xx方法的区别:1)link_xx会把所有的目标链接库文件/头文件 2)target_link_xx指定目标链接到库文件/头文件,所以目标先要生成,target_link_xx要在add_executable之后执行。

如果不指定目标参数,则报错:
Cannot specify link libraries for target xxx which is not built by this project.

HINTS, PATHS:指定除默认位置外要搜索的目录.HINTS与PATHS区别:HINTS是在搜索系统路径之前先搜索HINTS指定的路径,PATHS是先搜索系统路径,然后再搜索PATHS指定的路径。

9.头文件管理

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.目标管理

11.文件管理

12.安装打包

https://blog.csdn.net/youlinhuanyan/article/details/128762052

**方法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没有包含引用到的源码就会报这个错误

分类: cmake

0 条评论

发表回复

您的电子邮箱地址不会被公开。