首页 > 代码库 > cmake-buildsystem

cmake-buildsystem

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

 

cmake-buildsystem