2017.07.05
本文希望用短平快的方式,解決Cmake軟件的安裝配置使用問題,更進一步的參數配置與工程測試、報錯問題解決,可以參考他人文檔,眾人拾柴火焰高,整理好的相關資源鏈接也一并列出。
簡介
CMake是眾多Make工具中的一種,就是對代碼進行編譯,測試以及打包操作。
Make工具里面,比較出名的有GNU Make,QT 的qmake,微軟的MS nmake,BSD Make(pmake),Makepp,等等。這些 Make 工具遵循著不同的規范和標準,所執行的 Makefile 格式也千差萬別。這樣就帶來了一個嚴峻的問題:如果軟件想跨平臺,必須要保證能夠在不同平臺編譯。而如果使用上面的 Make 工具,就得為每一種標準寫一次 Makefile ,這將是一件讓人抓狂的工作。
而每次對出現的問題進行解決,即是一次對效率化的貢獻。因此CMake應運而生。
它可以讓程序員通過一個與開發平臺無關的CMakeList.txt文件來定制整個編譯流程,然后再根據目標用戶的平臺進一步生成所需的Makefile和工程文件,如*nix平臺的Makefile或者win平臺下面的VS工程。也是一種“Write once, run everywhere”。
一些比較出名的開源項目以及商業項目,也都是采用CMake作為項目架構系統,比如KDE以及OpenCV,奈飛(Netflix),第二人生(Second Life),還有LLVM 和Clang,MySQL等等。
安裝
官網是https://cmake.org?
https://cmake.org/download/ 這里可以下載到對應不同平臺的安裝包,這里分為源碼包以及二進制可執行文件兩類。然后根據需要進行下載安裝就好了,對于*nix下面的安裝,可以看另一篇帖子。
使用
CMake可以支持win和*nix,通過在平臺環境上進行搜索用于build的文件,windows+VS環境下,可以幫你生成.sln,vcxproj文件,而在*nix則是makefile,同理MAC OS則是xcode的項目文件。
程序員就可以使用CMakeLists.txt配置文件在本地編譯,鏈接文件,生成這些項目。
例如先創建一個小程序:
然后在相同目錄下創建一個CMakeLists.txt文件
其中第一行是 最低的版本號要求,一般默認寫2.6,方便兼容
第二行是項目信息,也就是項目名稱
第三行是指定生成目標,也就是生成可以被開發環境使用的工程項目文件
然后運行控制臺,切換到當前項目路徑里面,用 cmake . 運行程序
這里用VS11.0 完成了編譯,也是CMake自動搜索配置路徑得到的。
這里你可以看到,就自動從cpp源文件生成了一個完整的VS項目工程。
如果有多個源文件存在,則修改CMakeLists.txt,在制定目標那一行的文件后面進行添加操作
如果源文件眾多,還可以使用aux_source_directory命令,它可以查找指定目錄下的所有源文件,將結果存進指定變量名,語法格式如下:
aux_source_directory(<dir><variable>)
這樣,CMake 會將當前目錄所有源文件的文件名賦值給變量DIR_SRCS,再指示變量DIR_SRCS中的源文件需要編譯成一個名稱為 Demo 的可執行文件。
如果是多個目錄,多個源文件,例如路徑有一個show文件夾,里面包括show.c和show.h
那么需要分別在項目根目錄 test 和 show 目錄里各編寫一個 CMakeLists.txt 文件。為了方便,我們可以先將 show 目錄里的文件編譯成靜態庫再由 main 函數調用。
這種情況下,根目錄test里面的CMakeLists.txt需要改為:
使用命令add_subdirectory指明本項目包含一個子目錄 test,這樣 test 目錄下的 CMakeLists.txt 文件和源代碼也會被處理 。第6行,使用命令target_link_libraries指明可執行文件 nihao 需要連接一個名為 test 的鏈接庫 。
下面是修改子目錄中的CMakeLists.txt如下:
也是類似,使用命令add_library將 src 目錄中的源文件編譯為靜態鏈接庫。
如果目錄在其他路徑,則可以在test項目目錄一層CMakeLists里面添加
include_directories ("${PROJECT_SOURCE_DIR}/show")
進階
我們可以讓這個庫是可選,因為如果使用更大的庫或者依賴于第三方的庫時,會有這個需求。
也是在頂層的CMakeLists添加
option(USE_SHOW"Use test provided display function"ON)
這個設置會顯示在CMake的GUI中,并且其默認值為ON。當用戶選擇了之后,這個值會被保存在CACHE中,這樣就不需要每次CMAKE都進行更改了。
下面就繼續構建和鏈接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環境進行測試):CMake入門實戰
報錯分析合集:CMake error合集