cmake 學(xué)習

cmake 是什么让蕾?

cmake 是一個跨平臺的項目構(gòu)建工具,它使用與平臺無關(guān)的CMakeLists.txt 文件來指定各個項目的編譯過程或听。為什么要用cmake呢探孝?一是因為make 對windows平臺不友好,二是make管理大型項目特別麻煩誉裆。詳細討論可以參考知乎里面的討論[1]顿颅,總而言之,cmake 是寫大型項目必不可少的工具足丢,當然c++20 里面引入Modules后粱腻,會不會有其他的構(gòu)建工具不得而知。

編譯鏈接

用gcc 編譯源文件為可執(zhí)行程序

gcc -O2 -g -o p test.c

那么是gcc 是如何將源文件編譯成可執(zhí)行程序呢斩跌?書上[3]講解大概有四個步驟

  1. gcc運行C預(yù)處理器(cpp)將源文件翻譯成一個ascii碼文件test.i
  2. gcc在運行c編譯器(cc1)將test.i翻譯成匯編文件test.s (編譯原理主要內(nèi)容)
  3. gcc 在運行匯編器(as)將test.s翻譯成可重定位目標文件test.o
  4. gcc 最后運行鏈接器(ld) 將test.o 和一些必要的系統(tǒng)目標文件組合起來绍些,生成可執(zhí)行目標文件

如果需要觀察以上過程,可以執(zhí)行

gcc -O2 -g -o -v p test.c

如果需要觀察這些臨時文件耀鸦,可以執(zhí)行

gcc -save-temps test.c

目標文件的分類:

  1. 可重定位目標文件 :包含二進制代碼和數(shù)據(jù)柬批,其形式可以在編譯鏈接時候與其他可重定位文件合并,創(chuàng)建可執(zhí)行的目標文件袖订。
  2. 可執(zhí)行目標文件 :包含二進制代碼和數(shù)據(jù)萝快,其形式可以被直接拷貝到存儲器并執(zhí)行。
  3. 共享目標文件:一種特殊類型的可重定位目標文件著角,可以在加載或者運行時被動態(tài)的加載到存儲器并鏈接揪漩。

如何查看目標文件呢?可以通過readelf這個工具查看吏口,詳細解釋也可以查看[4]
readelf -a main.o

處理目標文件的工具:

ar: 創(chuàng)建靜態(tài)庫奄容,插入冰更、刪除、列出和提取成員
strings: 列出一個目標文件所有可打印的字符串信息
strip: 從目標文件中刪除符號表信息
nm: 列出目標文件的符號表中定義的符號
size:列出目標文件中結(jié)的名字和大小
readelf:顯示目標文件的完整結(jié)構(gòu)昂勒,包括ELF頭中編碼的所有信息蜀细。包含size和nm的功能
objdump: 可以反匯編.text結(jié)中的二進制指令
LDD: 列出可執(zhí)行文件運行時的共享庫

鏈接器的作用

符號解析和重定位

cmake 學(xué)習

構(gòu)建一個可執(zhí)行目標文件:

add_libary(archive archive.cpp zip.cpp lzma.cpp)
add_executable(zipapp zipapp.cpp)
target_link_libraries(zipapp archive)

archive 是一個靜態(tài)庫,它是由archive.cpp zip.cpp lzma.cpp 編譯得到的,zipapp 是一個可執(zhí)行的目標文件戈盈,它是由zipapp.cpp 編譯鏈接得到的奠衔,但是同時需要用到archive 這個靜態(tài)庫。

庫的類型

動態(tài)鏈接庫

add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)

靜態(tài)庫

add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)

MODULE

add_library(archive MODULE 7z.cpp)

不同之處在于他不用于 target_link_libraries()塘娶,它在運行時作為插件加載归斤。

OBJECT

add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp)

add_library(archiveExtras STATIC $<TARGET_OBJECTS:archive> extras.cpp)

add_executable(test_exe $<TARGET_OBJECTS:archive> test.cpp)

或者

add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp)

add_library(archiveExtras STATIC extras.cpp)
target_link_libraries(archiveExtras PUBLIC archive)

add_executable(test_exe test.cpp)
target_link_libraries(test_exe archive)

編譯時的特性

因為c語言有不同版本,c++也有不同的版本刁岸,當你用c++11脏里,編譯器 卻用-std99肯定是出現(xiàn)錯誤,于是為了設(shè)置編譯器的版本類型虹曙,同時為了讓編譯器支持不同的語言特性迫横,我們可以使用target_compile_features() 這個命令

add_library(mylib requires_constexpr.cpp)
# cxx_constexpr is a usage-requirement
target_compile_features(mylib PUBLIC cxx_constexpr)

# main.cpp will be compiled with -std=gnu++11 on GNU for cxx_constexpr.
add_executable(myexe main.cpp)
target_link_libraries(myexe mylib)
target_compile_features(mylib PUBLIC cxx_std_11)

同時cmake 還有一些優(yōu)化編譯和條件編譯的命令可供選擇,詳細可以查看文檔.

Cmake 支持的編譯器

AppleClang: Apple Clang for Xcode versions 4.4 though 9.2.
Clang: Clang compiler versions 2.9 through 6.0.
GNU: GNU compiler versions 4.4 through 8.0.
MSVC: Microsoft Visual Studio versions 2010 through 2017.
SunPro: Oracle SolarisStudio versions 12.4 through 12.6.
Intel: Intel compiler versions 12.1 through 17.0.

Cmake 支持的語言

all compilers and versions listed above for C++.
GNU: GNU compiler versions 3.4 through 8.0.

[1] https://www.zhihu.com/question/27455963
[2] https://cmake.org/cmake/help/v3.12/#reference-manuals
[3] http://csapp.cs.cmu.edu/
[4] https://blog.csdn.net/xuehuafeiwu123/article/details/72963229

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酝碳,一起剝皮案震驚了整個濱河市矾踱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疏哗,老刑警劉巖呛讲,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沃斤,居然都是意外死亡圣蝎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門衡瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徘公,“玉大人,你說我怎么就攤上這事哮针」孛妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵十厢,是天一觀的道長等太。 經(jīng)常有香客問我,道長蛮放,這世上最難降的妖魔是什么缩抡? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮包颁,結(jié)果婚禮上瞻想,老公的妹妹穿的比我還像新娘压真。我一直安慰自己,他們只是感情好蘑险,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布滴肿。 她就那樣靜靜地躺著,像睡著了一般佃迄。 火紅的嫁衣襯著肌膚如雪泼差。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天呵俏,我揣著相機與錄音堆缘,去河邊找鬼。 笑死柴信,一個胖子當著我的面吹牛套啤,可吹牛的內(nèi)容都是我干的宽气。 我是一名探鬼主播随常,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萄涯!你這毒婦竟也來了绪氛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤涝影,失蹤者是張志新(化名)和其女友劉穎枣察,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃逻,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡序目,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伯襟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猿涨。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姆怪,靈堂內(nèi)的尸體忽然破棺而出叛赚,到底是詐尸還是另有隱情,我是刑警寧澤稽揭,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布俺附,位于F島的核電站,受9級特大地震影響溪掀,放射性物質(zhì)發(fā)生泄漏事镣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一揪胃、第九天 我趴在偏房一處隱蔽的房頂上張望璃哟。 院中可真熱鬧唠叛,春花似錦、人聲如沸沮稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕴掏。三九已至障般,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盛杰,已是汗流浹背挽荡。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留即供,地道東北人定拟。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像逗嫡,于是被迫代替她去往敵國和親青自。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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