CMakeLists.txt学习记录
一、Cmake 學(xué)習(xí)地址與作用
cmake詳細(xì)見:https://gitlab.kitware.com/cmake/community/-/wikis/home
是一個(gè)跨平臺(tái)、開源的構(gòu)建系統(tǒng)。它是一個(gè)集軟件構(gòu)建、測試、打包于一身的軟件。它使用與平臺(tái)和編譯器獨(dú)立的配置文件來對軟件編譯過程進(jìn)行控制。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
二、常用命令?
# 聲明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )# 聲明一個(gè) cmake 工程
project( HelloSLAM )# 設(shè)置編譯模式
set( CMAKE_BUILD_TYPE "Debug" )# 添加一個(gè)可執(zhí)行程序
# 語法:add_executable( 程序名 源代碼文件 )
add_executable( helloSLAM helloSLAM.cpp )# 添加一個(gè)庫
add_library( hello libHelloSLAM.cpp )
# 共享庫
add_library( hello_shared SHARED libHelloSLAM.cpp )add_executable( useHello useHello.cpp )
# 將庫文件鏈接到可執(zhí)行程序上
target_link_libraries( useHello hello_shared )
 
*1.指定 cmake 的最小版本 :
命令可選,可以不寫,版本向后兼容。但如果所安裝CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的時(shí)候,就必須加這一行,提醒用戶升級(jí)到該版本之后再執(zhí)行 cmake。
cmake_minimum_required(VERSION 2.8) 
?*2. 設(shè)置項(xiàng)目名稱:
這里就是“helloworld”,這個(gè)命令不是強(qiáng)制性的,但最好都加上。它會(huì)引入兩個(gè)變量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同時(shí),cmake 自動(dòng)定義了兩個(gè)等價(jià)的變量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。?
project(helloworld) 
?*3. 設(shè)置編譯類型
add_library 默認(rèn)生成是靜態(tài)庫,通過以上命令生成文件名字,
- 在 Linux 下是:
demo
libcommon.a
libcommon.so - 在 Windows 下是:
demo.exe
common.lib
common.dll 
add_executable(helloworld helloworld.cpp) # 生成可執(zhí)行文件
add_library(common STATIC util.cpp) # 生成靜態(tài)庫
add_library(common SHARED util.cpp) # 生成動(dòng)態(tài)庫或共享庫 
?4. 指定編譯包含的源文件
*4.1 明確指定包含哪些源文件?
add_library(helloworld helloworld .cpp test.cpp util.cpp) 
4.2 搜索所有的 cpp 文件
?aux_source_directory(dir VAR) 發(fā)現(xiàn)一個(gè)目錄下所有的源代碼文件并將列表存儲(chǔ)在一個(gè)變量中。
aux_source_directory(. SRC_LIST) # 搜索當(dāng)前目錄下的所有.cpp文件
add_library(demo ${SRC_LIST}) 
?4.3 自定義搜索規(guī)則
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(helloworld ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(helloworld ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(helloworld ${SRC_LIST} ${SRC_PROTOCOL_LIST}) 
5. 查找指定的庫文件
find_library(VAR name path)查找到指定的預(yù)編譯庫,并將它的路徑存儲(chǔ)在變量中。
 默認(rèn)的搜索路徑為 cmake 包含的系統(tǒng)庫,因此如果是 NDK 的公共庫只需要指定庫的 name 即可。
cmake_minimum_required( VERSION 2.8 )
project( visualizeGeometry )set(CMAKE_CXX_FLAGS "-std=c++11")# 添加Eigen頭文件
include_directories( "/usr/include/eigen3" )# 添加Pangolin依賴
find_package( Pangolin )
include_directories( ${Pangolin_INCLUDE_DIRS} )add_executable( visualizeGeometry visualizeGeometry.cpp )
target_link_libraries( visualizeGeometry ${Pangolin_LIBRARIES} )
 
類似的命令還有 find_file()、find_path()、find_program()、find_package()。
??6. 設(shè)置包含的目錄
#example
include_directories( ${Pangolin_INCLUDE_DIRS} )include_directories(${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR}${CMAKE_CURRENT_SOURCE_DIR}/include
) 
7. 設(shè)置鏈接庫搜索目錄
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs
) 
Linux 下還可以通過如下方式設(shè)置包含的目錄?
?
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}") 
8. 設(shè)置 target 需要鏈接的庫
target_link_libraries( # 目標(biāo)庫demo# 目標(biāo)庫需要鏈接的庫# log-lib 是上面 find_library 指定的變量名${log-lib} ) 
?在 Windows 下,系統(tǒng)會(huì)根據(jù)鏈接庫目錄,搜索xxx.lib 文件,Linux 下會(huì)搜索 xxx.so 或者 xxx.a 文件,如果都存在會(huì)優(yōu)先鏈接動(dòng)態(tài)庫(so 后綴)。
8.1 指定鏈接動(dòng)態(tài)庫或靜態(tài)庫
target_link_libraries(demo libface.a) # 鏈接libface.a
target_link_libraries(demo libface.so) # 鏈接libface.so 
8.2 指定全路徑
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.so) 
?8.3 指定鏈接多個(gè)庫
target_link_libraries(demo${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.aboost_system.aboost_threadpthread) 
9. 設(shè)置變量
9.1 set 直接設(shè)置變量的值
set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST}) 
9.2 set 追加設(shè)置變量的值
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST}) 
9.3 list 追加或者刪除變量的值
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST}) 
10. 自定義編譯選項(xiàng)
cmake 允許為項(xiàng)目增加編譯選項(xiàng),從而可以根據(jù)用戶的環(huán)境和需求選擇最合適的編譯方案。
 例如,可以將 MathFunctions 庫設(shè)為一個(gè)可選的庫,如果該選項(xiàng)為 ON ,就使用該庫定義的數(shù)學(xué)函數(shù)來進(jìn)行運(yùn)算,否則就調(diào)用標(biāo)準(zhǔn)庫中的數(shù)學(xué)函數(shù)庫。
修改根目錄下的 CMakeLists.txt 文件如下:
# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Demo)
# 加入一個(gè)配置頭文件,用于處理 CMake 對源碼的設(shè)置
configure_file ("${PROJECT_SOURCE_DIR}/config.h.in""${PROJECT_BINARY_DIR}/config.h")
# 是否使用自己的 MathFunctions 庫
option (USE_MYMATH"Use provided math implementation" ON)
# 是否加入 MathFunctions 庫
if (USE_MYMATH)include_directories ("${PROJECT_SOURCE_DIR}/math")add_subdirectory (math)set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo ${EXTRA_LIBS}) 
configure_file 命令用于加入一個(gè)配置頭文件 config.h ,這個(gè)文件由 cmake 從 config.h.in 生成,通過這樣的機(jī)制,將可以通過預(yù)定義一些參數(shù)和變量來控制代碼的生成。
 option 命令添加了一個(gè) USE_MYMATH 選項(xiàng),并且默認(rèn)值為 ON 。根據(jù) USE_MYMATH 變量的值來決定是否使用我們自己編寫的 MathFunctions 庫。
 ?
總結(jié)
以上是生活随笔為你收集整理的CMakeLists.txt学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 红米手机投屏到长虹电视机?
 - 下一篇: 《梦仙》第四十三句是什么