Cmake用法

cmake --version 3.10 doclinux

1,Cmake introduce

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

1.1 經常使用的目錄結構

.
├── build
├── CMakeLists.txt
├── include
│   └── xxx.h
└── src
    ├── xxx.c
    └── main.c

2,CMakeLists.txt文件的寫法

編寫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)

Cmake 經常使用命令

Scripting Commands

set

設置常規變量
set(<variable> <value>... [PARENT_SCOPE])
設置環境變量
set(ENV{<variable>} <value>...).net

include

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])
從一個文件或模塊加載而且運行cmake代碼debug

Project Commands

add_executable

add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
用指定的源文件建立一個可執行文件
建立一個名字爲name 的可執行文件,name 在一個工程內必須是全局惟一的,可執行文件的實際名字會根據所在平臺重新構造,
(such as <name>.exe or just <name>).調試

add_library

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

aux_source_directory(<dir> <variable>)
把目錄「dir」中的全部源文件的名字存在變量"variable"中。orm

include_directories

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
爲編譯器器添加頭文件的搜索路徑,這些頭文件目錄將被添加到當前的CMakeLists文件的INCLUDE_DIRECTORIES屬性中。server

project

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

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。

gcc 編譯時候加入宏信息

編譯時需添加-gdwarf-2和-g3兩個參數。

加了-g3的參數後,gcc編譯的時候,會將擴展的debug 信息編譯進二進制文件裏面,包括宏定義信息。

http://www.javashuo.com/article/p-brgbdgcr-hk.html

相關文章
相關標籤/搜索