1.简介
目标分类:可执行程序、库、自定义目标。可执行程序和库属于二进制目标,自定义目标包含一些自定义命令。
2.二进制目标
add_executable() : 定义可执行程序
add_library() : 定义库。
target_link_libraries() : 定义二进制目标之间的依赖关系。
例:
add_library(archive archive.cpp zip.cpp lzma.cpp) add_executable(zipapp zipapp.cpp) target_link_libraries(zipapp archive)
archive定义为一个静态库(static library),包含archive.cpp,zip.cpp和lzma.cpp编译的目标文件。
zipapp定义为一个可执行程序,通过编译和连接zipapp.cpp得到。
当连接zipapp的时候,archive静态库被连入。
3.执行体
4.库
静态库与动态库:
默认情况下,add_library()定义静态库,通过指定SHARED 类型,可以定义动态库。
add_library(archive SHARED archive.cpp zip.cpp lzma.cpp) add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)
变量BUILD_SHARED_LIBS的值可用于改变默认生成静态库的行为。
MODULE库:
与上述不同,它不用于target_link_libraries()的参数。
add_library(archive MODULE 7z.cpp)
Apple Frameworks:
一个SHARED库可被标记为FRAMEWORK属性,用于创建OS X或iOS Framework Bundle。
通过MACOSX_FRAMEWORK_IDENTIFIER设置CFBundleIdentifier Key。
add_library(MyFramework SHARED MyFramework.cpp) set_target_properties(MyFramework PROPERTIES FRAMEWORK TRUE FRAMEWORK_VERSION A MACOSX_FRAMEWORK_IDENTIFIER org.cmake.MyFramework )
Object库:
Object库同样不能被连入,它定义了非打包的目标文件,这些目标文件通过编译指定的源文件得到。目标文件可作为源输入到其他目标。
add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp) add_library(archiveExtras STATIC $<TARGET_OBJECTS:archive> extras.cpp) add_executable(test_exe $<TARGET_OBJECTS:archive> test.cpp)
Build Specification and Usage Requirements
target_include_directories()、target_compile_definitions()、target_complie_options()分别修改目标的INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS、COMPILE_OPTIONS属性,和INTERFACE_INCLUDE_DIRECTORIES、INTERFACE_COMPILE_DEFINITIONS、INTERFACE_COMPILE_OPTIONS属性。
每个命令都有三种模式:PRIVATE、PUBLIC和INTERFACE。
PRIVATE:只影响non-INTERFACE_属性变量。
INTERFACE:只影响INTERFACE_属性变量。
public:两者都影响。
target_compile_definitions(archive PRIVATE BUILDING_WITH_LZMA INTERFACE USING_ARCHIVE_LIB )
目标属性
INCLUDE_DIRECTORIES 中的条目会被加到编译命令的 -I或-isystem后面。
COMPILE_DEFINITIONS中的条目会被加到编译命令的-D或/D后面,顺序未指定。DEFINE_SYMBOL目标属性可以为SHARED和MODULE库添加指定顺序的compile definition。
COMPILE_OPTIONS中的条目:escaped for the shell