CMake學(xué)習(xí)記錄

CMkae主要的開關(guān)選項

1,CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS

用來控制 IF ELSE 語句的書寫方式。

2甸私,BUILD_SHARED_LIBS

這個開關(guān)用來控制默認的庫編譯方式,如果不進行設(shè)置飞傀,使用 ADD_LIBRARY 并沒有指定庫類型的情況下皇型,默認編譯生成的庫都是靜態(tài)庫。

如果 SET(BUILD_SHARED_LIBS ON)后砸烦,默認生成的為動態(tài)庫弃鸦。

3,CMAKE_C_FLAGS

設(shè)置 C 編譯選項幢痘,也可以通過指令ADD_DEFINITIONS()添加唬格。

4,CMAKE_CXX_FLAGS

設(shè)置 C++編譯選項,也可以通過指令 ADD_DEFINITIONS()添加购岗。

PROJECT_SOURCE_DIR 和 CMAKE_SOURCE_DIR 的區(qū)別

Example
There is a difference between these variables. CMAKE_SOURCE_DIR does indeed refer to the folder where the top-level CMakeLists.txt is defined.

However, PROJECT_SOURCE_DIR refers to the folder of the CMakeLists.txt containing the most recent project() command.

For example, say you have a top-level project called Outer and this contains a subdirectory with its own project called Inner.

Outer's CMakeLists.txt has:

project(Outer)
add_subdirectory(Inner)

and Inner's:

project(Inner)

Then in both of these CMakeLists files, CMAKE_SOURCE_DIR will refer to Outer's source dir. But while PROJECT_SOURCE_DIR for Outer is also this same dir, this is not the case for Inner. Inner's PROJECT_SOURCE_DIR is the subdirectory containing its CMakeLists.txt.

This difference applies to all PROJECT_<var> vs CMAKE_<var> variables.

總結(jié):CMAKE_SOURCE_DIR指代頂層CMakeList.txt所在的目錄汰聋,而PROJECT_SOURCE_DIR則指代出現(xiàn)project()的最近的CMakeList.txt所在的目錄

CMake 自定義變量的方式

主要有隱式定義和顯式定義兩種,舉一個隱式定義的例子喊积,就是 PROJECT 指令烹困,他會隱式的定義<projectname>_BINARY_DIR<projectname>_SOURCE_DIR 兩個變量。

而顯式定義的例子注服,可以使用 SET 指令韭邓,就可以構(gòu)建一個自定義變量了。

CMake中常見環(huán)境變量的含義:

1溶弟,PROJECT_BINARY_DIR

如果是 in source 編譯女淑,這個變量指得就是工程頂層目錄,如果是 out-of-source 編譯辜御,指的是工程編譯發(fā)生的目錄鸭你。另外 <projectname>_BINARY_DIR 和 CMAKE_BINARY_DIR 跟這個變量指代的內(nèi)容是一致的。

2擒权,PROJECT_SOURCE _DIR

不論采用何種編譯方式袱巨,都是工程頂層目錄。也就是在 in source 編譯時碳抄,他跟 PROJECT_BINARY_DIR 等變量一致愉老。另外 <projectname>_SOURCE_DIR 和 CMAKE_SOURCE_DIR 跟這個變量指代的內(nèi)容是一致的。

3剖效,CMAKE_CURRENT_SOURCE_DIR

指的是當(dāng)前處理的 CMakeLists.txt 所在的路徑嫉入。

4,CMAKE_CURRRENT_BINARY_DIR

如果是 in-source 編譯璧尸,它跟 CMAKE_CURRENT_SOURCE_DIR 一致咒林,如果是 out-ofsource 編譯,他指的是 target 編譯目錄爷光。使用 ADD_SUBDIRECTORY(src bin) 可以更改這個變量的值垫竞。

5,CMAKE_CURRENT_LIST_FILE

輸出調(diào)用這個變量的 CMakeLists.txt 的完整路徑蛀序。

6欢瞪,CMAKE_CURRENT_LIST_LINE

輸出這個變量所在的行。

7徐裸,CMAKE_MODULE_PATH

這個變量用來定義自己的 .cmake 模塊所在的路徑引有。如果你的工程比較復(fù)雜,有可能會自己編寫一些 cmake 模塊倦逐,這些 cmake 模塊是隨你的工程發(fā)布的譬正,為了讓 cmake 在處理CMakeLists.txt 時找到這些模塊宫补,你需要通過 SET 指令,將自己的 .cmake 模塊路徑設(shè)置一下曾我。比如

SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

這時候你就可以通過 INCLUDE指令來調(diào)用自己的模塊了粉怕。

8,EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH

前者用來重新定義目標二進制可執(zhí)行文件的存放位置抒巢,后者用來重新定義目標鏈接庫文件的存放位置贫贝。

9,PROJECT_NAME

返回通過 PROJECT 指令定義的項目名稱蛉谜。

CMake 指令記錄

set 指令
語法:SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
指令功能:用來顯式的定義變量
例子:SET (SRC_LST main.c other.c)
說明:用變量代替值稚晚,例子中定義一個 SRC_LST 用來代替后面的字符串。


aux_source_directory 指令
語法:aux_source_directory(<dir> <variable>)
指令功能:在目錄中查找所有源文件型诚,收集指定目錄中所有源文件的名稱客燕,并將列表存儲在提供的<variable>
Example: aux_source_directory(common DE_UT_COMMON_SRCS)


add_executable 指令
語法:add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 [source2 ...])
指令功能:使用指定的源文件將可執(zhí)行文件添加到項目中
Example: add_executable(de_ut_tests ${DE_UT_SRCS} ${DE_UT_TESTS})


add_library 指令
語法:add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2] [...])
指令功能:將指定的源文件生成鏈接文件,然后添加到項目中去


target_link_libraries 指令
語法:target_link_libraries(<target> [item1] [item2] [...] [[debug|optimized|general] <item>] ...)
指令功能:將目標文件與庫文件進行鏈接狰贯,<target>目標文件一般是通過add_executable()add_library()指令生成的


$ENV{VAR}指令

語法:$ENV{VAR} 讀取環(huán)境變量 VAR


include 指令

include指令一般用于語句的復(fù)用也搓,也就是說,如果有一些語句需要在很多CMakeLists.txt文件中使用涵紊,為避免重復(fù)編寫傍妒,可以將其寫在.cmake文件中,然后在需要的CMakeLists.txt文件中進行include操作就行了摸柄。

include指令的結(jié)構(gòu)為:

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>][NO_POLICY_SCOPE])

雖然颤练,有不少的可選參數(shù),但是一般情況下驱负,都是直接寫:

include(file|module)

注意昔案,為了使CMakeLists.txt能夠找到該文件,需要指定文件完整路徑(絕對路徑或相對路徑)电媳,當(dāng)然如果指定了CMAKE_MODULE_PATH,就可以直接include該目錄下的.cmake文件了庆亡。

.cmake 文件里包含了一些 cmake 命令和一些宏/函數(shù)匾乓,當(dāng)CMakeLists.txt包含該 .cmake 文件時,當(dāng)編譯運行時又谋,該 .cmake 里的一些命令就會在該包含處得到執(zhí)行拼缝,并且在包含以后的地方能夠調(diào)用該 .cmake 里的一些宏和函數(shù)。


宏和函數(shù)的定義

關(guān)鍵字:cmake 的宏是MACRO彰亥,函數(shù)是function咧七。它們的用法是:

macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令語句
  COMMAND2(ARGS ...)
  ...
endmacro()

function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令語句
  COMMAND2(ARGS ...)
  ...
function()

宏和函數(shù)的區(qū)別:

其實和C/C++里面宏和函數(shù)之間的區(qū)別差不多,宏就是字符串替換任斋,函數(shù)就是使用變量继阻,在命令中途可以對改變量進行修改。

Example:

首先創(chuàng)建一個 CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
include(test.cmake)

在同目錄下創(chuàng)建文件 test.cmake

set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endmacro()
message("=== Call macro ===")
Moo(${var})

function(Foo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(${var})

運行 cmake

mkdir build && cd build
cmake ..

運行后的輸出結(jié)果是:

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
=== Call macro ===
arg = ABC
# After change the value of arg.
arg = ABC
=== Call function ===
arg = ABC
# After change the value of arg.
arg = abc
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yngzmiao/test/build

從這里可以看出,宏實現(xiàn)的僅僅是字符串替換瘟檩,宏定義的過程中是無法進行修改的抹缕,而函數(shù)卻是可以的。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墨辛,一起剝皮案震驚了整個濱河市卓研,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睹簇,老刑警劉巖奏赘,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異太惠,居然都是意外死亡磨淌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門垛叨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伦糯,“玉大人,你說我怎么就攤上這事嗽元×哺伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵剂癌,是天一觀的道長淤翔。 經(jīng)常有香客問我,道長佩谷,這世上最難降的妖魔是什么旁壮? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谐檀,結(jié)果婚禮上抡谐,老公的妹妹穿的比我還像新娘。我一直安慰自己桐猬,他們只是感情好麦撵,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溃肪,像睡著了一般免胃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惫撰,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天羔沙,我揣著相機與錄音,去河邊找鬼厨钻。 笑死扼雏,一個胖子當(dāng)著我的面吹牛坚嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呢蛤,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惶傻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了其障?” 一聲冷哼從身側(cè)響起银室,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎励翼,沒想到半個月后蜈敢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡汽抚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年抓狭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片造烁。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡否过,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惭蟋,到底是詐尸還是另有隱情苗桂,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布告组,位于F島的核電站煤伟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏木缝。R本人自食惡果不足惜便锨,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望我碟。 院中可真熱鬧放案,春花似錦、人聲如沸矫俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恳守。三九已至,卻和暖如春贩虾,著一層夾襖步出監(jiān)牢的瞬間催烘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工缎罢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伊群,地道東北人考杉。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像舰始,于是被迫代替她去往敵國和親崇棠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353