现代cmake
cmake -B build(要放在的文件夹)
cmake —build build
- 使用带target前缀的cmake函数,这样能够避免依赖与这个库的被扩散这些定义
- 很多情况下可执行文件也会被作为一个.so,然后再由一个接口程序来嗲用这个.so,这样能够保证自身也能作为别人的一个子模块,比如python
- 一个库可以包括很多组件,语法库::组件,引入库不代表引入了所有组件
- -G指定生成器例如-GNinja
- ccmake来显式调整变量
PROJECT_SOURCE_DIR:当前项目源码路径(存放main.cpp的地方)
PROJECT_BINARY_DIR:当前项目输出路径(存放main.exe的地方)
CMAKE_SOURCE_DIR:根项目源码路径(存放main.cpp的地方)
CMAKE_BINARY_DIR:根项目输出路径(存放main.exe的地方)
PROJECT_IS_TOP_LEVEL:BOOL类型,表示当前项目是否是(最顶层的)根项目
PROJECT_NAME:当前项目名
CMAKE_PROJECT_NAME:根项目的项目名
- -std=c++20比cmake中直接设定属性烂,因为cmake中的配置对跨平台更友好
- {}套${}
- 动态库无法链接静态库,因此要让静态库生成的时候生成位置无关的代码就可以链接了,-fPIC
- message(STATUS “…”) 表示信息类型是状态信息,有 – 前缀
- message(WARNING “…”) 表示是警告信息
- message(FATAL_ERROR “…”) 表示是错误信息,会终止 CMake 的运行
- 清除缓存,其实只需删除 build/CMakeCache.txt 就可以了
- 设置缓存变量,语法是:set(变量名 “变量值” CACHE 变量类型 “注释”)
- CMake 对 BOOL 类型缓存的 set 指令提供了一个简写:option
- option(变量名 “描述” 变量值),等价于:set(变量名 CACHE BOOL 变量值 “描述”)
- 变量的传播规则:父会传给子
- 可以用 set 的 PARENT_SCOPE 选项,把一个变量传递到上一层作用域(也就是父模块)。
- if (DEFINED xx) 判断某变量是否存在
- 在include里面再套一层文件夹是为了避免名字的冲突
- 因此 find_package 并不是直接去找具体的动态库文件和头文件(例如 libQt5Core.so)。
而是去找包配置文件(例如Qt5Config.cmake)
现代cmake
https://lhish.github.io/project/hide/现代cmake/