basic TODO: rename
经典三行
1 | cmake_minimum_required(VERSION 3.9) |
使用
1 | cmake -B build # 生成构建目录,-B 指定生成的构建系统代码放在 build 目录 |
-B
指定生成的构建系统存放的目录- e.g. 生成make,ninja的系统
--build build
真正build,执行build目录中的构建系统- e.g. 用对应的make, ninja开始构建
解耦
拆分成库
制作静态库
1 | add_library(libanswer STATIC answer.cpp) |
使用库: 给targe链接上库target_link_libraries()
1 | add_executable(answer main.cpp) |
拆成子目录
进一步模块化
头文件怎么办?
TODO:
进一步解耦
细分同一层的子目录,CMakeLists.txt
管理
1 | add_subdirectory(answer) |
使用第三方库
1 | find_package(CURL REQUIRED) |
find_package(CURL REQUIRED)
- 找CURL库,
CURL
和CURL::libcurl
这个名字是约定的名字 REQUIRED
表示必要,没找到会报错
- 找CURL库,
PRIVATE
libanswer
内部的内容,接口不暴露
CACHE变量
“私密数据应该通过从外部传入”。Cmake中先”声明”
1 | set(WOLFRAM_APPID "" CACHE STRING "WolframAlpha APPID") |
set()
第一个参数是变量名,第二个参数是默认值,第三个参数 CACHE 表示是 cache 变量,第四个参数是变量类型,第五个参数是变量描述
BOOL
类型的变量还可以用option()
来设置
1 | set(ENABLE_CACHE OFF CACHE BOOL "Enable request cache") |
设置变量值 : 使用-D
参数传递,或使用ccmake
用TUI的形式修改
1 | cmake -B build -DWOLFRAM_APPID=xxx |
程序中当作宏使用,e.g. 通过环境变量获取。
1 | target_compile_definitions(libanswer PRIVATE WOLFRAM_APPID="${WOLFRAM_APPID}") |
注意什么时候需要引号,WOLFRAM_APPID="${WOLFRAM_APPID}"
等价于#define WOLFRAM_APPID "xxxxx"
。”原样替换”
设置的粒度
任何一个目录的CMakeList.txt里存在都会改变全局。
1 | set(CMAKE_CXX_STANDARD 11) |
target_compile_features
仅影响单个target,细粒度地指定feature
1 | target_compile_features(libanswer INTERFACE cxx_std_20) |
单元测试
TODO: