CMAKE使用

1故痊、定義

CMALKE是一款開(kāi)源的跨平臺(tái)構(gòu)建系統(tǒng)帝簇,這個(gè)名字是"Cross platform Make"的縮寫(xiě)贬芥。其工作依賴(lài)于CMakeLists.txt文件笑诅,通過(guò)該文件生成不同平臺(tái)下對(duì)應(yīng)的構(gòu)建體。

1)構(gòu)建
  • Xcode
cmake .. -G  "Xocde"
  • Visual Studio
cmake .. -G "Visual Studio 2019 Win64"
  • Linux
cmake ..
2)平臺(tái)區(qū)分

跨平臺(tái)構(gòu)建時(shí)可從一下預(yù)定義區(qū)分編譯環(huán)境:

目標(biāo)平臺(tái) 宏 CMAKE_SYSTEM_NAME
windows Windows
linux Linux
mac Darwin
目標(biāo)處理器 宏 CMAKE_HOST_SYSTEM_PROCESSOR
x86 x86_64
ARM arm64

2疮鲫、常用選項(xiàng)

1)設(shè)置項(xiàng)目名稱(chēng)
project(<project-name>)

cmake會(huì)將設(shè)置的變量存入PROJECT_NAMECMAKE_PROJECT_NAME中吆你。后續(xù)可以使用${PROJECT_NAME}${CMAKE_PROJECT_NAME}調(diào)用。

2)包含源文件
aux_source_directory(<dir> <variable>)

將目錄dir中的文件名俊犯,全部存入variable中妇多。(這里不會(huì)遞歸調(diào)用子目錄)

例:
aux_source_directory(./BBEncoder/src DIR_SRCS)
3) 包含頭文件
file(GLOB_RECURSE <variable> [RELATIVE <path>]  [<globbing-expressions>...] )

從源文件樹(shù)收集文件列表,寫(xiě)入變量variable中燕侠。GLOB_RECURSE 將會(huì)遞歸所有匹配文件夾的子文件夾和匹配的文件者祖。

source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>])

source_group() 用于定義生成 IDE 工程時(shí)的源碼分組。

例:
file(GLOB_RECURSE CURRENT_HEADERS  ./BBEncoder/include/*.h ./BBEncoder/include/*.hpp)
source_group("Header Files" FILES ${CURRENT_HEADERS})
4) 指定生成目標(biāo)
add_executable(<name> [WIN32] [MACOSX_BUNDLE]  [EXCLUDE_FROM_ALL]
                [source1] [source2 ...])

使用指定的源文件將可執(zhí)行文件添加到項(xiàng)目中,只有在 add_executable() 中的文件才會(huì)被 source_group 分組绢彤。

例:
add_executable(${PROJECT_NAME} ${DIR_SRCS} ${CURRENT_HEADERS})
5)指定安裝路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
//或
set(RUNTIME_OUTPUT_DIRECTORY  ${PROJECT_SOURCE_DIR}/bin)
6)設(shè)置編譯屬性
//debug
set(CMAKE_BUILD_TYPE "debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -std=c++11 -Wall -g -ggdb")
//release
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -std=c++11 -Wall -O2")

3七问、添加外部庫(kù)

當(dāng)添加外部庫(kù)時(shí),程序的編譯構(gòu)建需要以下信息:

  • 外部庫(kù)的頭文件(*.h)
  • 函數(shù)庫(kù)的動(dòng)態(tài)/靜態(tài)鏈接文件(.so茫舶、.dylib械巡、.dll、.lib)
  • 函數(shù)庫(kù)名
1)指定頭文件目錄
 target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
   <INTERFACE|PUBLIC|PRIVATE> [items1...]
   [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
2) 鏈接庫(kù)文件
 target_link_libraries(<target> ... <item>... ...)

這里需要區(qū)分鏈接路徑和運(yùn)行路徑:連接器在處理動(dòng)態(tài)庫(kù)時(shí)將鏈接時(shí)路徑(Link-time path)和運(yùn)行時(shí)路徑(Run-time path)分開(kāi),用戶(hù)可以通過(guò)-L指定連接時(shí)庫(kù)的路徑饶氏,通過(guò)-R(或-rpath)指定程序運(yùn)行時(shí)庫(kù)的路徑讥耗。

cmake設(shè)定link_directories添加鏈接器查找?guī)斓哪夸洠?/p>

 link_directories([AFTER|BEFORE] directory1 [directory2 ...])

cmake設(shè)定rpath:

set(INSTALL_LIB_DIR "${PROJECT_BINARY_DIR}/lib") # 假設(shè)安裝目錄在編譯目錄的lib子目錄內(nèi)
set(CMAKE_SKIP_BUILD_RPATH FALSE)  
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)  
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")  
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
2) 查找系統(tǒng)自帶的庫(kù)

系統(tǒng)自帶的庫(kù)的安裝路徑,在不同的機(jī)器上可能不同疹启,使用cmake的find_package可自動(dòng)搜索該路徑古程。

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])

以查找JPEG為例,系統(tǒng)如果找到了JPEG模塊喊崖,那么cmake會(huì)設(shè)置以下變量供CMakeLists.txt使用:

          JPEG_FOUND           #為true
          JPEG_INCLUDE_DIRS    #include路徑
          JPEG_LIBRARY_DIRS    #library路徑
          JPEG_LIBRARIES       #library的名字
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挣磨,一起剝皮案震驚了整個(gè)濱河市雇逞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趋急,老刑警劉巖喝峦,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異呜达,居然都是意外死亡谣蠢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)查近,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)眉踱,“玉大人,你說(shuō)我怎么就攤上這事霜威√冈” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵戈泼,是天一觀(guān)的道長(zhǎng)婿禽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)大猛,這世上最難降的妖魔是什么扭倾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮挽绩,結(jié)果婚禮上膛壹,老公的妹妹穿的比我還像新娘。我一直安慰自己唉堪,他們只是感情好模聋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著唠亚,像睡著了一般链方。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趾撵,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天侄柔,我揣著相機(jī)與錄音,去河邊找鬼占调。 笑死暂题,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的究珊。 我是一名探鬼主播薪者,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剿涮!你這毒婦竟也來(lái)了言津?” 一聲冷哼從身側(cè)響起攻人,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悬槽,沒(méi)想到半個(gè)月后怀吻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡初婆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蓬坡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磅叛。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屑咳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弊琴,到底是詐尸還是另有隱情兆龙,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布敲董,位于F島的核電站紫皇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腋寨。R本人自食惡果不足惜坝橡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望精置。 院中可真熱鬧,春花似錦锣杂、人聲如沸脂倦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赖阻。三九已至,卻和暖如春踱蠢,著一層夾襖步出監(jiān)牢的瞬間火欧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工茎截, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苇侵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓企锌,卻偏偏與公主長(zhǎng)得像榆浓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撕攒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開(kāi)發(fā)時(shí)陡鹃,如果不熟悉用 CMake 來(lái)構(gòu)建烘浦,讀不懂 CMa...
    cfanr閱讀 24,378評(píng)論 1 53
  • CMake 是一種跨平臺(tái)的免費(fèi)開(kāi)源軟件工具,用于使用與編譯器無(wú)關(guān)的方法來(lái)管理軟件的構(gòu)建過(guò)程萍鲸。在 Android S...
    張坤的筆記閱讀 4,176評(píng)論 0 2
  • CMake簡(jiǎn)介 CMake是一個(gè)跨平臺(tái)的闷叉、開(kāi)源的構(gòu)建工具。cmake是makefile的上層工具脊阴,它們的目的正是為...
    GGBondz閱讀 320評(píng)論 0 0
  • android中c++標(biāo)準(zhǔn)的選擇 C++ Standard 指定編譯庫(kù)的環(huán)境握侧,其中Toolchain Defaul...
    夏大王2019閱讀 1,248評(píng)論 0 0
  • CMake簡(jiǎn)介 CMake 是一個(gè)跨平臺(tái)的安裝(編譯[https://baike.baidu.com/item/%...
    skycoder閱讀 5,032評(píng)論 0 3