1故痊、定義
CMALKE是一款開(kāi)源的跨平臺(tái)構(gòu)建系統(tǒng)帝簇,這個(gè)名字是"Cross platform Make"的縮寫(xiě)贬芥。其工作依賴(lài)于CMakeLists.txt
文件笑诅,通過(guò)該文件生成不同平臺(tái)下對(duì)應(yīng)的構(gòu)建體。
1)構(gòu)建
- Xcode
cmake .. -G "Xocde"
- Visual Studio
cmake .. -G "Visual Studio 2019 Win64"
- Linux
cmake ..
2)平臺(tái)區(qū)分
跨平臺(tái)構(gòu)建時(shí)可從一下預(yù)定義區(qū)分編譯環(huán)境:
目標(biāo)平臺(tái) | 宏 CMAKE_SYSTEM_NAME |
---|---|
windows | Windows |
linux | Linux |
mac | Darwin |
目標(biāo)處理器 | 宏 CMAKE_HOST_SYSTEM_PROCESSOR |
---|---|
x86 | x86_64 |
ARM | arm64 |
2疮鲫、常用選項(xiàng)
1)設(shè)置項(xiàng)目名稱(chēng)
project(<project-name>)
cmake會(huì)將設(shè)置的變量存入PROJECT_NAME
與CMAKE_PROJECT_NAME
中吆你。后續(xù)可以使用${PROJECT_NAME}
或${CMAKE_PROJECT_NAME}
調(diào)用。
2)包含源文件
aux_source_directory(<dir> <variable>)
將目錄dir
中的文件名俊犯,全部存入variable
中妇多。(這里不會(huì)遞歸調(diào)用子目錄)
例:
aux_source_directory(./BBEncoder/src DIR_SRCS)
3) 包含頭文件
file(GLOB_RECURSE <variable> [RELATIVE <path>] [<globbing-expressions>...] )
從源文件樹(shù)收集文件列表,寫(xiě)入變量variable
中燕侠。GLOB_RECURSE 將會(huì)遞歸所有匹配文件夾的子文件夾和匹配的文件者祖。
source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>])
source_group() 用于定義生成 IDE 工程時(shí)的源碼分組。
例:
file(GLOB_RECURSE CURRENT_HEADERS ./BBEncoder/include/*.h ./BBEncoder/include/*.hpp)
source_group("Header Files" FILES ${CURRENT_HEADERS})
4) 指定生成目標(biāo)
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL]
[source1] [source2 ...])
使用指定的源文件將可執(zhí)行文件添加到項(xiàng)目中,只有在 add_executable() 中的文件才會(huì)被 source_group 分組绢彤。
例:
add_executable(${PROJECT_NAME} ${DIR_SRCS} ${CURRENT_HEADERS})
5)指定安裝路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
//或
set(RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
6)設(shè)置編譯屬性
//debug
set(CMAKE_BUILD_TYPE "debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -std=c++11 -Wall -g -ggdb")
//release
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -std=c++11 -Wall -O2")
3七问、添加外部庫(kù)
當(dāng)添加外部庫(kù)時(shí),程序的編譯構(gòu)建需要以下信息:
- 外部庫(kù)的頭文件(*.h)
- 函數(shù)庫(kù)的動(dòng)態(tài)/靜態(tài)鏈接文件(.so茫舶、.dylib械巡、.dll、.lib)
- 函數(shù)庫(kù)名
1)指定頭文件目錄
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
2) 鏈接庫(kù)文件
target_link_libraries(<target> ... <item>... ...)
這里需要區(qū)分鏈接路徑和運(yùn)行路徑:連接器在處理動(dòng)態(tài)庫(kù)時(shí)將鏈接時(shí)路徑(Link-time path)和運(yùn)行時(shí)路徑(Run-time path)分開(kāi),用戶(hù)可以通過(guò)-L指定連接時(shí)庫(kù)的路徑饶氏,通過(guò)-R(或-rpath)指定程序運(yùn)行時(shí)庫(kù)的路徑讥耗。
cmake設(shè)定link_directories
添加鏈接器查找?guī)斓哪夸洠?/p>
link_directories([AFTER|BEFORE] directory1 [directory2 ...])
cmake設(shè)定rpath
:
set(INSTALL_LIB_DIR "${PROJECT_BINARY_DIR}/lib") # 假設(shè)安裝目錄在編譯目錄的lib子目錄內(nèi)
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
2) 查找系統(tǒng)自帶的庫(kù)
系統(tǒng)自帶的庫(kù)的安裝路徑,在不同的機(jī)器上可能不同疹启,使用cmake的find_package可自動(dòng)搜索該路徑古程。
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
以查找JPEG
為例,系統(tǒng)如果找到了JPEG模塊喊崖,那么cmake會(huì)設(shè)置以下變量供CMakeLists.txt使用:
JPEG_FOUND #為true
JPEG_INCLUDE_DIRS #include路徑
JPEG_LIBRARY_DIRS #library路徑
JPEG_LIBRARIES #library的名字