CmakeLists.txt 文件內容詳細講解

轉自:https://blog.csdn.net/qq_21950671/article/details/102660518

聲明 cmake 最低版本
聲明 cmake 工程名字
設置 cmake 編譯模式
添加c++11標準支持
添加變量
添加依賴
添加頭文件
添加一個可執行程序
構建靜態庫
構建靜動態庫或者共享庫
將庫文件鏈接到可執行程序上
指定安裝地址
Debug和Release版本
調試手段
CMake常用變量
CMake是一種跨平臺編譯工具,比make更爲高級,使用起來要方便得多。CMake主要是編寫CMakeLists.txt文件,然後用cmake命令將CMakeLists.txt文件轉化爲make所需要的makefile文件,最後用make命令編譯源碼生成可執行程序或共享庫。

CMake的核心是讀取文件“CMakeLists.txt”,運行“cmake”命令時,它會尋找這個文件,根據裏面的內容生成標準的 Makefiles,這裏的“CMakefiles.txt”和用來生成 Makefiles 的文件是一致的。

聲明 cmake 最低版本
定義cmake的最低版本時2.8
cmake_minimun_required(VERSION 2.8)
可以在終端中查看cmake的版本

cmake -version
輸出如下
cmake version 3.2.2

這裏需要注意兩點,如果不定義需要的版本可能會報個warning,如果有強迫症或者追求完美,還是把這行代碼寫上吧。第二點,不要定義的版本比自己安裝的版本還高,那樣估計就是直接編譯不通過了。

聲明 cmake 工程名字
project( HelloSLAM )

PROJECT_SOURCE_DIR
項目根目錄,也就是CmakeLists.txt目錄的絕對路徑。

設置 cmake 編譯模式
set( CMAKE_BUILD_TYPE “Debug” )

添加c++11標準支持
注意等式左右兩端不要加空格
set(CMAKE_CXX_FLAGS “-std=c++11”)

有的時候可能會遇到,一定要注意是大寫的O,不是數字0
set(CMAKE_CXX_FLAGS “-std=c++11 -O3”)

其中,參數CMAKE_CXX_FLAGS含義是: set compiler for c++ language
而後面的-O3(是字母opq的o,大寫的歐)是用來調節編譯時的優化程度的,最高爲-O3,最低爲-O0(即不做優化)

-Ox這個參數只有在CMake -DCMAKE_BUILD_TYPE=Release時有效,因爲debug 版的項目生成的可執行文件需要有調試信息並且不需要進行優化,而 release 版的不需要調試信息但需要優化。

添加變量
下面講解如何爲程序添加版本號和帶有使用版本號的頭文件。
set(KEY VALUE)接受兩個參數,用來聲明變量。
在camke語法中使用KEY並不能直接取到VALUE,必須使用${KEY}這種寫法來取到VALUE。
Create variables used for exporting in SophusConfig.cmake
set( Sophus_INCLUDE_DIR ${PROJECT_SOURCE_DIR} )

添加依賴
find_package( Sophus REQUIRED )
find_package( Pangolin )

opencv
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

eigen
include_directories( “/usr/include/eigen3/” )

pcl
find_package( PCL REQUIRED COMPONENT common io )
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )

在CMakeLists.txt如果需要使用第三方庫,那麼需要知道三個東西
去哪裏找頭文件(.h等) 對應於GCC的參數 -I
去哪裏找庫文件(.so/.lib/.ddl等) 對應於GCC的參數 -L
需要鏈接的庫文件名稱 對應於GCC的參數 -l

比如我需要鏈接第三方庫curl,那麼在CMakeLists.txt中可以書寫如下:
include_directories(/usr/include) # 對應於-I
target_link_libraries(target curl) # 對應於 -L和-l
find_package的作用就是去尋找該庫的頭文件位置、庫文件位置以及庫文件名稱,並將其設爲變量,返回提供給CMakeLists.txt其他部分使用。

添加頭文件
include_directories( “/usr/include/eigen3” )
include_directories( ${Pangolin_INCLUDE_DIRS} )
include_directories( ${Sophus_INCLUDE_DIRS} )

添加一個可執行程序
語法:add_executable( 程序名 源代碼文件 )
add_executable( helloSLAM helloSLAM.cpp )

構建靜態庫
add_library( hello libHelloSLAM.cpp )
生成靜態庫".a"文件

構建靜動態庫或者共享庫
add_library( hello_shared SHARED libHelloSLAM.cpp )

生成動態庫".so"文件
add_executable( useHello useHello.cpp )

構建大型項目時可以爲使用這個庫添加一個開關
在項目根目錄下的CMakeLists.txt文件中添加如下代碼:
option (USE_MYMATH “Use tutorial provided math implementation” ON)

將庫文件鏈接到可執行程序上
target_link_libraries( useHello hello_shared )
target_link_libraries( imageBasics ${OpenCV_LIBS} )
target_link_libraries( joinMap ${OpenCV_LIBS} ${PCL_LIBRARIES} )

指定安裝地址
第一種方式:
使用 CMAKE_INSTALL_PREFIX 來指定

cmake -DCMAKE_INSTALL_PREFIX=/usr …

第二種方式:
修改cmake文件,加入:

SET(CMAKE_INSTALL_PREFIX < install_path >)

Debug和Release版本
debug 版的項目生成的可執行文件需要有調試信息並且不需要進行優化,、
release 版的不需要調試信息但需要優化。這些特性在 gcc/g++ 中是通過編譯時的參數來決定的,如果將優化程度調到最高需要設置參數-O3,最低是 -O0 即不做優化;添加調試信息的參數是 -g -ggdb ,如果不添加這個參數,調試信息就不會被包含在生成的二進制文件中。

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_SOURCE_DIR .)

SET(CMAKE_CXX_FLAGS_DEBUG"ENVCXXFLAGS−O0−Wall−g−ggdb")SET(CMAKECXXFLAGSRELEASE"ENV{CXXFLAGS} -O0 -Wall -g -ggdb")SET(CMAKE_CXX_FLAGS_RELEASE"ENVCXXFLAGS−O0−Wall−g−ggdb")SET(CMAKE 
C
​    
 XX 
F
​    
 LAGS 
R
​    
 ELEASE"ENV{CXXFLAGS} -O3 -Wall")

AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})

兩個變量 CMAKE_CXX_FLAGS_DEBUG 和CMAKE_CXX_FLAGS_RELEASE, 分別用於 debug 和 release 的編譯選項。編輯 CMakeList.txt 後需要執行 ccmake 命令生成 Makefile 。在進入項目的根目錄,輸入 “ccmake .” 進入一個圖形化界面。

調試手段
message

打印信息,類似於 echo/printf ,主要用於查cmake文件的語法錯誤。

set(mysql_use_test_sources ${SOURCES_DIRECTORY}/test_sources/mysql_user_accounts.cpp)
message(“mysql_use_test_sources : ${mysql_use_test_sources}”)

CMake常用變量
CMAKE_STATIC_LIBRARY_PREFIX 靜態庫前綴, Linux下默認爲lib
CMAKE_STATIC_LIBRARY_SUFFIX 靜態庫後綴,Linux下默認爲.a
CMAKE_SHARED_LIBRARY_PREFIX 動態庫前綴,Linux下默認爲lib
CMAKE_SHARED_LIBRARY_SUFFIX 動態庫後綴,Linux下默認爲.so

CMAKE_BUILD_TYPE 指定基於make的產生器的構建類型(Release,Debug)
CMAKE_C_FLAGS *.C文件編譯選項,如 -std=c99 -O3 -march=native
CMAKE_CXX_FLAGS *.CPP文件編譯選項,如 -std=c++11 -O3 -march=native

CMAKE_RUNTIME_OUTPUT_DIRECTORY 生成可執行文件路徑
CMAKE_LIBRARY_OUTPUT_DIRECTORY 生成庫的文件夾路徑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章