属性

读写属性的一些命令

  • set_property()
  • get_property()
  • set_target_properties()
  • get_target_property()
  • set_directory_properties()
  • get_directory_properties()

get_target_property(), get_directory_properties()get_property() 命令的简化版本.

全局作用域属性

  • ENABLED_LANGUAGES, 当前支持编译哪些语言
  • JOB_POOLS, 用于管理并行编译的任务
  • CMAKE_CXX_KNOWN_FEATURES, 当前 cmake 版本支持的 C++ 语言特性
get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
message("languages: ${ENABLED_LANGUAGES}")

目录属性

  • VARIABLES, 当前目录定义了哪些变量, 方便调试
  • BINARY_DIR, 当前目录对应的构建目录, 绝对路径
  • SOURCE_DIR, 当前源码目录的绝对路径
  • PARENT_DIRECTORY, 由哪个目录引入的当前目录, 绝对路径
  • MACROS, 当前目录定义了哪些宏
  • SUBDIRECTORIES, 当前目录引入了哪些子目录
  • LINK_DIRECTORIES, 当前目录的库查找路径, 是一个字符串列表; 里面包含了从 父作用域中继承过来的值. 通常是通过 link_libraries() 命令引入的.
  • INCLUDE_DIRECTORIES, 当前目录的头文件查找路径, 是一个字符串列表; 里面包含了 从父作用域中继承过来的值, 通常是通过 include_directories() 命令引入的.

比如:

get_property(PARENT_DIR DIRECTORY . PROPERTY PARENT_DIRECTORY)
message("PARENT DIR: ${PARENT_DIR}")

Target 属性

  • BINARY_DIR
  • BUILD_RPATH,
  • INSTALL_RPATH,
  • LINK_DIRECTORIES, 该 target 的库查找路径, 是一个字符串列表; 里面包含了从 当前的目录作用域中继承过来的值. 通常是通过 target_link_libraries() 命令引入的.
  • INCLUDE_DIRECTORIES, 该 target 的头文件查找路径, 是一个字符串列表; 里面包含了 从当前的目录作用域中继承过来的值, 通常是通过 target_include_directories() 命令引入的.
  • COMPILE_OPTIONS, 传给编译器的选项, 通常是用 target_compile_options() 命令引入的.
  • CXX_STANDARD, 使用哪个标准编译当前目标.
set_property(TARGET demo PROPERTY CXX_STANDARD 14)

引入头文件

target_include_directories() 用于给一个目标指定可查找的头文件, 它接受一个权限参数:

  • PULIBC, 对于库有意. 对于本库的使用者来说, 库本身的头文件及其依赖的头文件, 都是必需的. 会同时将指定的库加入到 LINK_LIBRARIESINTERFACE_LINK_LIBRARIES 属性里.
  • PRIVATE, 对于本库的使用者来说, 只有库本身的头文件是导出的, 不会导出本库的依赖库, 只会将指定的库加入到 LINK_LIBRARIES 属性里.
  • INTERFACE, 对于
target_link_libraries(Foo
    PUBLIC Bar::Bar
    PRIVATE Cow::Cow
)

引入新的源代码文件

target_sources() 用于给一个已定义的 target 引入新的源代码文件. 比如:

if(WIN32)
    target_sources(Foo utils_win32.cpp utils_win32.h)
endif()

链接到新的库

target_link_libraries() 将一个目标链接到指定的库或者别的目标.

find_package(Bar 2.0 REQUIRED)
...
target_link_libraries(Foo PRIVATE Bar::Bar)

要注意的是, 需要给 target_link_libraries() 指定可见性, 它有三种:

  • PUBLIC, 本 target 导出的API, 依赖了这个库时, 要用 PUBLIC
  • PRIVATE, 对于只用于内部的库, 使用这个
  • INTERFACE, 对于 header-only 的库, 使用这个选项

参考

CMake Properties 手册