添加target
-
add_executable(mytool mytool.cpp)
添加可執(zhí)行target -
add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)
添加lib携栋,lib類型包括:
- SHARED:動(dòng)態(tài)庫/共享庫响蓉,dll/so/dylib
- STATIC:靜態(tài)庫爆存,.lib/.a
- MODULE:插件資源文件等類型,不導(dǎo)出符號(hào)拴袭,不可用于鏈接,用于動(dòng)態(tài)加載
- OBJECT:不用于生成庫文件,定義表示obj文件集合的變量
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)
定義編譯參數(shù)
# 對(duì)應(yīng)gcc/clang的 -I
target_include_directories(target,
<model> <include文件夾>)
# 對(duì)應(yīng)gcc/clang的-D
target_compile_definitions(target,
<model> <宏定義>)
# 對(duì)應(yīng)gcc/clang的-f/-m/-W
target_compile_options(target,
<model> <編譯器flag>)
這三個(gè)指令定義了target的兩組屬性:
以下三個(gè)屬性編譯自己時(shí)使用
- INCLUDE_DIRECTORIES
- COMPILE_DEFINITIONS
- COMPILE_OPTIONS
target_link_libraries(a b)時(shí)a會(huì)從b的以下三個(gè)屬性繼承值到自己的屬性,
即a.INCLUDE_DIRECTORIES += b.INTERFACE_INCLUDE_DIRECTORIES
- INTERFACE_INCLUDE_DIRECTORIES簸搞,
- INTERFACE_COMPILE_DEFINITIONS,
- INTERFACE_COMPILE_OPTIONS
modle可以是以下三個(gè)類型:
- PRIVATE:只有源文件使用准潭,只定義非INTERFACE_變量
- PUBLIC:源文件和頭文件都使用趁俊,兩組變量都定義
- INTERFACE:只有頭文件使用,只定義INTERFACE_變量
add_library(archive archive.cpp)
target_compile_definitions(archive INTERFACE USING_ARCHIVE_LIB)
add_library(serialization serialization.cpp)
target_compile_definitions(serialization INTERFACE USING_SERIALIZATION_LIB)
add_library(archiveExtras extras.cpp)
target_link_libraries(archiveExtras PUBLIC archive)
target_link_libraries(archiveExtras PRIVATE serialization)
# archiveExtras is compiled with -DUSING_ARCHIVE_LIB and -DUSING_SERIALIZATION_LIB
add_executable(consumer consumer.cpp)
# consumer is compiled with -DUSING_ARCHIVE_LIB
target_link_libraries(consumer archiveExtras)
# 可以同時(shí)link多個(gè)不同的model
target_link_libraries(archiveExtras
PUBLIC archive
PRIVATE serialization
)
# include可以時(shí)絕對(duì)路徑或相對(duì)路徑(相對(duì)于當(dāng)前CMakeLists.txt)
add_library(lib1 lib1.cpp)
target_include_directories(lib1 PRIVATE
/absolute/path
relative/path
)
target輸出目錄
RUNTIME_OUTPUT_DIRECTORY和RUNTIME_OUTPUT_NAME控制以下target的輸出目錄和文件名稱
- add_executable()生成的可執(zhí)行文件
- add_library(target SHARED ...)在Windows上生成的動(dòng)態(tài)庫
LIBRARY_OUTPUT_DIRECTORY和LIBRARY_OUTPUT_NAME控制以下target的輸出目錄和文件名稱
- add_library(target MODULE ...)生成的不導(dǎo)出符號(hào)的插件動(dòng)態(tài)庫
- add_library(target SHARED ...)在linux/osx上生成的動(dòng)態(tài)庫
ARCHIVE_OUTPUT_DIRECTORY和ARCHIVE_OUTPUT_NAME控制以下target的輸出目錄和文件名稱
- add_library(target STATIC ...)生成的靜態(tài)庫
- add_library(target SHARED ...)在Windows上生成動(dòng)態(tài)庫時(shí)刑然,導(dǎo)出符號(hào)所在的.lib文件
- add_executable()在Windows上設(shè)置了ENABLE_EXPORTS屬性時(shí)寺擂,導(dǎo)出符號(hào)所在的.lib文件
add_executable(redis main.c)
set_target_properties(redis
PROPERTIES RUNTIME_OUTPUT_DIRECTORY lib)
set_target_properties(redis
PROPERTIES RUNTIME_OUTPUT_NAME test)
編譯一些簡單的項(xiàng)目,這些就夠用啦F寐印U怼!