目錄html
CMake是一種跨平臺編譯工具,用來生成makefile。CMake主要是編寫CMakeLists.txt文件,而後用cmake命令執行CMakeLists.txt文件生成make所須要的makefile文件,最後用make命令編譯源碼生成可執行程序或庫文件。
cmake 指向CMakeLists.txt所在的目錄,例如cmake .. 表示CMakeLists.txt在當前目錄的上一級目錄。cmake後會生成不少編譯的中間文件以及makefile文件,因此通常建議新建一個新的目錄,專門用來編譯,例如工具
mkdir ckbuild cd ckbuild cmake .. make
. ├── build ├── CMakeLists.txt ├── include │ └── xxx.h └── src ├── xxx.c └── main.c
編寫CMakeLists.txt文件,該文件通常放在和src,include的同級目錄ui
#1.cmake verson,指定cmake版本 cmake_minimum_required(VERSION 3.5) #2.project name,指定項目的名稱,通常和項目的文件夾名稱對應 PROJECT(findstr) #3.head file path,頭文件目錄 INCLUDE_DIRECTORIES( include ) #4.source directory,源文件目錄 AUX_SOURCE_DIRECTORY(src DIR_SRCS) #5.set environment variable,設置環境變量,編譯用到的源文件所有都要放到這裏,不然編譯可以經過,可是執行的時候會出現各類問題,好比"symbol lookup error xxxxx , undefined symbol" SET(TEST_MATH ${DIR_SRCS} ) #6.add executable file,添加要編譯的可執行文件 ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH}) #7.add link library,添加可執行文件所須要的庫,好比咱們用到了libm.so(命名規則:lib+name+.so),就添加該庫的名稱 #TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
設置常規變量
set(<variable> <value>... [PARENT_SCOPE])
設置環境變量
set(ENV{<variable>} <value>...)
.net
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
從一個文件或模塊加載而且運行cmake代碼debug
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
用指定的源文件建立一個可執行文件
建立一個名字爲name 的可執行文件,name 在一個工程內必須是全局惟一的,可執行文件的實際名字會根據所在平臺重新構造,
(such as <name>.exe or just <name>)
.調試
add_library Normal Libraries Imported Libraries Object Libraries Alias Libraries Interface Libraries
Normal Libraries
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
建立一個名字爲name 的庫,name 在一個工程內必須是全局惟一的,實際名字會根據所在平臺進行轉化,
(such as lib<name>.a or <name>.lib).
庫的類型也許被指定爲:STATIC, SHARED, or MODULE
。靜態庫在連接到其它文件的時候被使用,動態庫是動態連接在運行時加載,
MODULE
庫不被連接到別的文件,也許在運行時被加載。
若是沒有說明是靜態仍是共享,則依據變量BUILD_SHARED_LIBS
是否打開來肯定類型。
若是變量BUILD_SHARED_LIBS
沒有使用,默認是靜態庫,用法示例:code
add_library(archive SHARED archive.cpp zip.cpp lzma.cpp) add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)
aux_source_directory(<dir> <variable>)
把目錄「dir」中的全部源文件的名字存在變量"variable"中。orm
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
爲編譯器器添加頭文件的搜索路徑,這些頭文件目錄將被添加到當前的CMakeLists文件的INCLUDE_DIRECTORIES
屬性中。server
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...]) project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [DESCRIPTION <project-description-string>] [LANGUAGES <language-name>...])
爲整個工程設置名稱,版本,和使用的語言。
設置的工程名存儲在變量PROJECT_NAME
中。
cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])
這個命令放在 CMakeLists.txt 的最前面,爲工程設定最低的cmake版本。
若是cmake版本低於要求,會中止編譯,並報錯。
(ref)[https://www.linuxidc.com/Linux/2014-03/98622.htm]
三 生成可調試版本的程序
1使用CMAKE編譯確實很方便。但CMAKE默認編譯出來的程序不帶有符號文件,用GDB沒法調試。
2 要編譯時產生符號文件供調試,調用CMAKE時,帶上 -DCMAKE_BUILD_TYPE=Debug
例如:在build文件中輸入:
cmake .. -DCMAKE_BUILD_TYPE=Debug
這樣產生的makefile文件make生成的可執行文件就帶有調試信息,供gdb和gdbserver使用了。
*****另外有另外一種更好的方法是在工程主CMakeLists.txt中的PROJECT語句後加入一句
SET(CMAKE_BUILD_TYPE Debug)
CMake 中有一個變量 CMAKE_BUILD_TYPE ,能夠的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。當這個變量值爲 Debug 的時候,CMake 會使用變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串做爲編譯選項生成 Makefile ,當這個變量值爲 Release 的時候,工程會使用變量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 選項生成 Makefile。
編譯時需添加-gdwarf-2和-g3兩個參數。
加了-g3的參數後,gcc編譯的時候,會將擴展的debug 信息編譯進二進制文件裏面,包括宏定義信息。