2017.07.05
本文希望用短平快的方式励背,解決Cmake軟件的安裝配置使用問題瑟枫,更進一步的參數配置與工程測試斗搞、報錯問題解決,可以參考他人文檔慷妙,眾人拾柴火焰高僻焚,整理好的相關資源鏈接也一并列出。
簡介
CMake是眾多Make工具中的一種膝擂,就是對代碼進行編譯虑啤,測試以及打包操作。
Make工具里面架馋,比較出名的有GNU Make狞山,QT 的qmake,微軟的MS nmake叉寂,BSD Make(pmake)萍启,Makepp,等等。這些 Make 工具遵循著不同的規(guī)范和標準勘纯,所執(zhí)行的 Makefile 格式也千差萬別局服。這樣就帶來了一個嚴峻的問題:如果軟件想跨平臺,必須要保證能夠在不同平臺編譯驳遵。而如果使用上面的 Make 工具淫奔,就得為每一種標準寫一次 Makefile ,這將是一件讓人抓狂的工作堤结。
而每次對出現的問題進行解決搏讶,即是一次對效率化的貢獻。因此CMake應運而生霍殴。
它可以讓程序員通過一個與開發(fā)平臺無關的CMakeList.txt文件來定制整個編譯流程媒惕,然后再根據目標用戶的平臺進一步生成所需的Makefile和工程文件,如*nix平臺的Makefile或者win平臺下面的VS工程来庭。也是一種“Write once, run everywhere”妒蔚。
一些比較出名的開源項目以及商業(yè)項目,也都是采用CMake作為項目架構系統(tǒng)月弛,比如KDE以及OpenCV肴盏,奈飛(Netflix),第二人生(Second Life)帽衙,還有LLVM 和Clang菜皂,MySQL等等。
安裝
官網是https://cmake.org?
https://cmake.org/download/ 這里可以下載到對應不同平臺的安裝包厉萝,這里分為源碼包以及二進制可執(zhí)行文件兩類恍飘。然后根據需要進行下載安裝就好了,對于*nix下面的安裝谴垫,可以看另一篇帖子章母。
使用
CMake可以支持win和*nix,通過在平臺環(huán)境上進行搜索用于build的文件,windows+VS環(huán)境下翩剪,可以幫你生成.sln,vcxproj文件乳怎,而在*nix則是makefile,同理MAC OS則是xcode的項目文件前弯。
程序員就可以使用CMakeLists.txt配置文件在本地編譯蚪缀,鏈接文件,生成這些項目恕出。
例如先創(chuàng)建一個小程序:
然后在相同目錄下創(chuàng)建一個CMakeLists.txt文件
其中第一行是 最低的版本號要求询枚,一般默認寫2.6,方便兼容
第二行是項目信息剃根,也就是項目名稱
第三行是指定生成目標哩盲,也就是生成可以被開發(fā)環(huán)境使用的工程項目文件
然后運行控制臺,切換到當前項目路徑里面狈醉,用 cmake . 運行程序
這里用VS11.0 完成了編譯廉油,也是CMake自動搜索配置路徑得到的。
這里你可以看到苗傅,就自動從cpp源文件生成了一個完整的VS項目工程抒线。
如果有多個源文件存在,則修改CMakeLists.txt渣慕,在制定目標那一行的文件后面進行添加操作
如果源文件眾多嘶炭,還可以使用aux_source_directory命令,它可以查找指定目錄下的所有源文件逊桦,將結果存進指定變量名眨猎,語法格式如下:
aux_source_directory(<dir><variable>)
這樣,CMake 會將當前目錄所有源文件的文件名賦值給變量DIR_SRCS强经,再指示變量DIR_SRCS中的源文件需要編譯成一個名稱為 Demo 的可執(zhí)行文件睡陪。
如果是多個目錄,多個源文件匿情,例如路徑有一個show文件夾兰迫,里面包括show.c和show.h
那么需要分別在項目根目錄 test 和 show 目錄里各編寫一個 CMakeLists.txt 文件。為了方便炬称,我們可以先將 show 目錄里的文件編譯成靜態(tài)庫再由 main 函數調用汁果。
這種情況下,根目錄test里面的CMakeLists.txt需要改為:
使用命令add_subdirectory指明本項目包含一個子目錄 test玲躯,這樣 test 目錄下的 CMakeLists.txt 文件和源代碼也會被處理 据德。第6行,使用命令target_link_libraries指明可執(zhí)行文件 nihao 需要連接一個名為 test 的鏈接庫 跷车。
下面是修改子目錄中的CMakeLists.txt如下:
也是類似晋控,使用命令add_library將 src 目錄中的源文件編譯為靜態(tài)鏈接庫。
如果目錄在其他路徑姓赤,則可以在test項目目錄一層CMakeLists里面添加
include_directories ("${PROJECT_SOURCE_DIR}/show")
進階
我們可以讓這個庫是可選赡译,因為如果使用更大的庫或者依賴于第三方的庫時,會有這個需求不铆。
也是在頂層的CMakeLists添加
option(USE_SHOW"Use test provided display function"ON)
這個設置會顯示在CMake的GUI中蝌焚,并且其默認值為ON。當用戶選擇了之后誓斥,這個值會被保存在CACHE中只洒,這樣就不需要每次CMAKE都進行更改了。
下面就繼續(xù)構建和鏈接Show庫劳坑。為了達到這個目的毕谴,我們可以改變頂層的CMakeLists文件:
配置文件configure_file命令用于加入一個配置頭文件 config.h ,這個文件由 CMake 從config.h.in生成,通過這樣的機制涝开,可以預定義一些參數和變量來控制代碼的生成循帐。
在添加函數庫這里使用了USE_SHOW來決定我們自己的庫show是否會被編譯和使用。注意這里變量EXTRA_LIBS的使用方法舀武。這是保持一個大的項目看起來比較簡潔的一個方法拄养。源代碼中相應的變化就比較簡單了:
#ifdef USE_SHOW
#include"show.h"
#endif
最后當然是編寫config.h.in文件
因為在前面的配置文件里面,用到了config.h银舱,里面預定義了USE_SHOW的值瘪匿,但是我們不需要直接去編寫它,更方便的辦法是寫一個config.h.in文件寻馏,從CMakeLists.txt中導入配置棋弥。
config.h.in文件里面寫下面一句:
#cmakedefine USE_SHOW
Linux下的使用
同理,如果做好了Linux的配置诚欠,也是一樣的顽染。
在項目目錄下面使用 cmake .,軟件會去確認當前默認的編譯工具聂薪,比如GNU 4.8.1
然后其他流程類似家乘,不過在Linux下面可以使用ccmake 或者 cmake -i 來打開交互式配置界面方便選擇。
方向鍵選擇不同選項藏澳,enter鍵進行修改仁锯,c鍵完成配置,g鍵確認生成makefile翔悠,其他的操作可以參考界面上的提示业崖。
正文就介紹到這里,如果需要進一步學習了解的蓄愁,參考資料整理如下:
安裝和測試及報錯分析
windows下(測試可用):CMake簡要教程
Linux下(沒有Kali環(huán)境進行測試):CMake入門實戰(zhàn)
報錯分析合集:CMake error合集