编译过程与链接过程需要向编译器及链接器传入不同的参数,而这些参数分为以下几类:
此函数向目标添加编译选项,
target_compile_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_compile_options(sample PUBLIC /arch=avx2 /Wall)
需要注意的是,如果要设置c / c++ 标准,不仅可以使用该函数添加 -std=STANDARD,还可以且更推荐设置以下两个cmake预设宏的值:
CMAKE_C_STANDARD
CMAKE_CXX_STANDARD
此函数专门向目标添加预设宏声明及定义。
target_compile_definitions(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_compile_definitions(sample PRIVATE BUILD_DLL PUBLIC "-DPI=3.14159")
此函数专门向目标设置c / c++版本。当然,你仍然可以选择第一个函数中的两种做法。
target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])
target_compile_features(sample PUBLIC cxx_std_17)
该函数向目标添加了预编译头文件。
target_precompile_headers(<target>
<INTERFACE|PUBLIC|PRIVATE> [header1...]
[<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])
target_precompile_headers(sample PRIVATE pch.hpp)
该函数声明了编译目标时查找使用头文件的路径。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_include_directories(sample PUBLIC public/include/sample PRIVATE sample)
该函数声明了链接时需要参与的依赖库名称或target。其名称可包含完整路径。
target_link_libraries(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_link_libraries(sample PUBLIC CURL::curl glib m)
注意:由于一个target中包含多个属性,一般情况下包含了头文件路径。
该函数声明了链接时,查找依赖库的路径。
target_link_directories(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_link_directories(sample PUBLIC third_party/libs/x86/rel)
该函数声明了添加额外的链接选项。
target_link_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_link_options(sample PUBLIC /shared)
该函数声明了向target添加源文件。
target_sources(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_sources(sample PRIVATE decode.cxx)
注:不要认为这个函数完全无用,可以被 add_library / add_executable 替代。在某些情况下,此函数还是非常好用的。
当需要使用cmake export关键字导出声明的target并附带其中的 PUBLIC 属性时,我们必须 将PUBLIC / PRIVATE / INTERFACE 关键字向这类 target 族函数补齐。且如果一个 target 族函数声明了这三个关键字其中之一,该 target 所属的其他 target 族函数均应当声明关键字。且对于包含路径的值,我们需要声明此值的使用范围:
所以,我们通常情况下使用以下方式:
target_include_directories(sample PRIVATE $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/header/include> PUBLIC $<INSTALL_INTERFACE:include>)
cmake_minimum_required(VERSION 3.0)
project(sample CXX)
set(CMAKE_CXX_STANDARD 11)
add_library(sample sample.cpp)
target_include_directories(sample PRIVATE $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/header/include> PUBLIC $<INSTALL_INTERFACE:include>)
target_compile_options(sample PUBLIC /Wall)
target_compile_definitions(sample PRIVATE BUILD_DLL INTERFACE USE_DLL)
target_link_libraries(sample PRIVATE thread m)