cmake用法

示例源碼
在 linux 平臺(tái)下使用 CMake 生成 Makefile 并編譯的流程如下:

    1. 編寫 CMake 配置文件 CMakeLists.txt
    1. 執(zhí)行命令 cmake PATH 或者 ccmake PATH 生成 Makefile

ccmake 和 cmake 的區(qū)別在于前者提供了一個(gè)交互式的界面。
币呵。其中谴轮, PATH 是 CMakeLists.txt 所在的目錄。

  • 使用 make 命令進(jìn)行編譯距辆。
入門案例一(單文件)

先看下目錄和源碼


1.png

代碼的邏輯非常簡(jiǎn)單就是求10的立方。
重點(diǎn)時(shí)候在CMakeLists.txt

# '#'行后面的都是注釋

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)

# 項(xiàng)目信息
project (Calc)

# 指定生成目標(biāo)  main為編譯生成文件, main.cpp為源文件
add_executable(main main.cpp)
  • # 為注釋標(biāo)識(shí)
  • cmake_minimum_required是最低版本要求娃豹,這個(gè)是必須要的
  • project 項(xiàng)目信息
  • add_executable 將main.cpp編譯成main

如果我們將cmake_minimum_required (VERSION 2.8)版本改成2.9.2退客。我的機(jī)器上cmake版本是cmake version 2.8.12.2骏融。執(zhí)行cmake .后報(bào)錯(cuò):

2.png

正常執(zhí)行完cmake后,會(huì)在根目錄下生成Makefile萌狂。然后我們就可以用make來編譯了档玻。

入門案例二(同目錄多文件)

這里我們?cè)诎咐坏幕A(chǔ)上新增Math.hMath.cpp

#include "Math.h"
long pow(int base,int power){
        long res=1;
        for(int i=0; i<power; i++) {
                res*=base;
        }
        return res;
}

然后修改main.cpp的include文件茫藏,將使用系統(tǒng)的math.h替換成我們自己的Math.h

#include <iostream>
#include "Math.h"
using namespace std;
int main(){
        int x=10;
        int y=3;
        int res=pow(10,3);
        cout<<res<<endl;
        return 0;
}

修改CMakeLists.txt
方法一

add_executable(main main.cpp Math.cpp)

add_executable參數(shù)中加入Math.cpp
方法二
如果源文件很多误趴,這樣寫就很蛋疼了。我們可以使用aux_source_directory命令

aux_source_directory(<dir> <variable>)

該命令會(huì)查找指定目錄下的所有源文件务傲,然后將結(jié)果存進(jìn)指定變量名凉当。

# '#'行后面的都是注釋

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)

# 項(xiàng)目信息
project (Calc)

# 指定生成目標(biāo)  main為編譯生成文件, main.cpp為源文件
# 方法一:一個(gè)個(gè)添加
# add_executable(main main.cpp Math.cpp)

# 方法二:查找目錄下文件到變量中树灶,然后引用變量
# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 指定生成目標(biāo)
add_executable(Demo ${DIR_SRCS})
入門案例三(多目錄纤怒、多文件)

對(duì)于這種情況,需要分別在項(xiàng)目根目錄 Simple和 math 目錄里各編寫一個(gè) CMakeLists.txt 文件天通。為了方便泊窘,我們可以先將 math 目錄里的文件編譯成靜態(tài)庫(kù)再由 main 函數(shù)調(diào)用。

3.png

math瞎的CMakeLists.txt內(nèi)容為:

# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)

# 生成鏈接庫(kù)
add_library (MathFunctions ${DIR_LIB_SRCS})

當(dāng)然像寒,main.cpp引入的頭文件也要修改烘豹,math.h的位置已經(jīng)變了。

#include "math/Math.h"
入門案例四(自定義編譯選項(xiàng))
# '#'行后面的都是注釋

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)

# 項(xiàng)目信息
project (Calc)

# 加入一個(gè)配置頭文件诺祸,用于處理 CMake 對(duì)源碼的設(shè)置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否使用自己的 MathFunctions 庫(kù)
option (USE_MYMATH
       "Use provided math implementation" ON)

# 是否加入 MathFunctions 庫(kù)
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(main main.cpp)

# 添加鏈接庫(kù)
target_link_libraries(main ${EXTRA_LIBS})

添加config.h.in

#cmakedefine USE_MYMATH

修改main.cpp

#include <iostream>
#include "config.h"

#ifdef USE_MYMATH
  #include "math/Math.h"
#else
  #include <math.h>
#endif

using namespace std;
int main(){
        int x=10;
        int y=3;
        int res=pow(10,3);
        cout<<res<<endl;
        return 0;
}

如果定義了USE_MYMATH就使用自己的Math.h否則include系統(tǒng)的math.h
這里我們可以使用ccmake命令携悯,可以選擇ON或OFF。然后按c進(jìn)行配置筷笨。然后再按g進(jìn)行生成


4.png

5.png
入門案例五(安裝和測(cè)試)
添加版本號(hào)

首先修改頂層 CMakeLists 文件憔鬼,在 project 命令之后加入如下兩行:

# 設(shè)置版本號(hào)
set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

為了在代碼中獲取版本信息,我們可以修改 config.h.in 文件胃夏,添加兩個(gè)預(yù)定義變量:

#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

程序中就可以獲取相關(guān)信息

cout<<"Version "<<Demo_VERSION_MAJOR<<"."<<Demo_VERSION_MINOR<<endl;
生成安裝包

首先在頂層的 CMakeLists.txt 文件尾部添加下面幾行:

# 構(gòu)建一個(gè) CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
  "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)

上面的代碼做了以下幾個(gè)工作:

導(dǎo)入 InstallRequiredSystemLibraries 模塊轴或,以便之后導(dǎo)入 CPack 模塊;
設(shè)置一些 CPack 相關(guān)變量仰禀,包括版權(quán)信息和版本信息照雁,其中版本信息用了上一節(jié)定義的版本號(hào);
導(dǎo)入 CPack 模塊答恶。

  • 生成二進(jìn)制安裝包:
cpack -C CPackConfig.cmake
6.png
  • 生成源碼安裝包
cpack -C CPackSourceConfig.cmake
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饺蚊,一起剝皮案震驚了整個(gè)濱河市萍诱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌污呼,老刑警劉巖裕坊,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燕酷,居然都是意外死亡碍庵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門悟狱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來静浴,“玉大人,你說我怎么就攤上這事挤渐∑幌恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵浴麻,是天一觀的道長(zhǎng)得问。 經(jīng)常有香客問我,道長(zhǎng)软免,這世上最難降的妖魔是什么宫纬? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮膏萧,結(jié)果婚禮上漓骚,老公的妹妹穿的比我還像新娘。我一直安慰自己榛泛,他們只是感情好蝌蹂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹锨,像睡著了一般孤个。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沛简,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天齐鲤,我揣著相機(jī)與錄音,去河邊找鬼椒楣。 笑死给郊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撒顿。 我是一名探鬼主播丑罪,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼荚板,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼凤壁!你這毒婦竟也來了吩屹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拧抖,失蹤者是張志新(化名)和其女友劉穎煤搜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唧席,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擦盾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淌哟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迹卢。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徒仓,靈堂內(nèi)的尸體忽然破棺而出腐碱,到底是詐尸還是另有隱情,我是刑警寧澤掉弛,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布症见,位于F島的核電站,受9級(jí)特大地震影響殃饿,放射性物質(zhì)發(fā)生泄漏谋作。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一乎芳、第九天 我趴在偏房一處隱蔽的房頂上張望遵蚜。 院中可真熱鬧,春花似錦奈惑、人聲如沸谬晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攒钳。三九已至,卻和暖如春雷滋,著一層夾襖步出監(jiān)牢的瞬間不撑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工晤斩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焕檬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓澳泵,卻偏偏與公主長(zhǎng)得像实愚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • CMake學(xué)習(xí) 本篇分享一下有關(guān)CMake的一些學(xué)習(xí)心得以及相關(guān)使用腊敲。 本文目錄如下: [1击喂、CMake介紹] [...
    AlphaGL閱讀 12,252評(píng)論 11 79
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開發(fā)時(shí),如果不熟悉用 CMake 來構(gòu)建碰辅,讀不懂 CMa...
    cfanr閱讀 24,430評(píng)論 1 53
  • 1.安裝 $sudo apt-get install cmake 2.示例:簡(jiǎn)單的文件目錄 sample |—...
    荷包蛋醬閱讀 29,656評(píng)論 0 15
  • 虛假的愛戀 背離的諾言 你說的未來懂昂,那么遠(yuǎn) 時(shí)光的蹉跎 青春的離散 為了愛你,我的人生那么暗 清醒的瞬間 重生的容...
    人生是一場(chǎng)旅行閱讀 182評(píng)論 0 0
  • 人們先是觀察某種行為没宾,然后才接受它凌彬。
    這里Cc閱讀 108評(píng)論 0 0