目录

「CMake」叫我痴心换真情

记录并整理CMake配置及使用技巧。

安装

语法

Pseudo Targets

伪库是一种不生成最终二进制库,而用于传播信息复用中间对象的库。

Interface Libraries

接口库 用于对它依赖的库指定使用要求,它本身不编译源文件也不产生二进制库。

CMake >= 3.15 可以对 接口库 设置 PUBLIC_HEADERPRIVATE_HEADER 属性,以便在 install 时进行安装。

CMake >= 3.19
库目标可以选择含源码,主要用于 header-only 库。

CMake >= 3.23
可以使用 target_sources::INTERFACE 添加头文件到接口库。

add_library(Eigen INTERFACE)

target_sources(Eigen INTERFACE
  FILE_SET HEADERS
    BASE_DIRS src
    FILES src/eigen.h src/vector.h src/matrix.h
)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 Eigen)

Object Libraries

添加源文件到 对象库,且无需将目标文件归档或链接到某个常规库。
常利用其可作为源文件注入其它对象的特性一次性生成动态库、静态库。

CMake >= 3.12
可以使用 target_link_libraries() 连接 对象库

add_library(<name> OBJECT <sources>...)  # 创建

add_library(... $<TARGET_OBJECTS:objlib> ...)  # 注入到普通库
add_executable(... $<TARGET_OBJECTS:objlib> ...)  # 注入到可执行对象

Alias Libraries

Toolchains

Cross Compiling

模板

参考