属性
读写属性的一些命令
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_LIBRARIES
和INTERFACE_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 的库, 使用这个选项