寫在前面
由于軟件開發(fā)越來越工程化巨量化,不同于單文件的簡單編譯鏈接生成可執(zhí)行文件,工程軟件所涉及的依賴越來越復(fù)雜及文件數(shù)量越來越大,其編譯鏈接過程十分復(fù)雜,因此掌握一套軟件工程編譯工具是很有必要的,并且對于復(fù)雜軟件工程的開發(fā)及研究也是很有裨益。
CMake就是一款用于軟件工程編譯的工具。因為實際應(yīng)用的程序大多數(shù)都是使用這個工具作為高層次工具,因此熟練掌握及應(yīng)用這個工具對于之后的學(xué)習(xí)和工作有挺多的便利。本文基于自己對于CMake的認(rèn)識和學(xué)習(xí)進(jìn)行的簡單總結(jié),為了方便自己之后查看以及同樣初學(xué)的同學(xué)參考。
目錄
- 一. CMake基本認(rèn)識
- 二. CMake基本使用步驟
- 三. CMakeLists基本概念
一. CMake基本認(rèn)識
CMake
這個工具是為了方便使用make
編譯構(gòu)建工具而誕生的。因為make
工具本身是較為底層的編譯構(gòu)建工具,對于大型軟件工程如果我們自己來編寫makefile
這個難度較大而且可能也容易出錯,而CMake
就是基于make
的高層次編譯構(gòu)建工具。
與make
工具類似,CMake
工具也需要編寫構(gòu)建文件,默認(rèn)名為CMakeLists.txt
。CMake
工具利用編寫好的編譯構(gòu)建文件CMakeLists.txt
,生成makefile
,之后再利用make
工具完成實際的編譯構(gòu)建過程。因此我們可以看出CMake
就是用于生成規(guī)范化的makefile
的工具,實際上的編譯構(gòu)建工作還是由make
實現(xiàn),只不過CMake
將編譯構(gòu)建過程進(jìn)行了更高層次地抽象,更容易讓人理解,減少了很多自己編寫makefile
文件可能存在的麻煩和可能出現(xiàn)的問題。除此之外,CMake
還能方便地讓人控制編譯過程,可以提高軟件工程編譯構(gòu)建的靈活性。
二. CMake基本使用步驟
CMake
工具的基本使用離不開可執(zhí)行程序cmake
和編譯構(gòu)建文件CMakeLists.txt
的配合。一個基本的使用CMake
工具進(jìn)行編譯的軟件工程的簡單用法如下。
軟件工程結(jié)構(gòu)如下:
project
|--build
│--CMakeLists.txt
│--source.cpp
-
build
:表示CMake
生成的cache文件目錄以及后續(xù)編譯構(gòu)建生成文件的保存目錄。 -
CMakeLists.txt
:CMake
編譯構(gòu)建文件。
對于形式如上的工程,整個編譯構(gòu)建過程如下:
- 切換當(dāng)前目錄至
build
文件目錄下 - 運行命令行:
cmake ..
這句話的意思表示指定CMakeLists.txt
所在的目錄,并且在build
目錄下生成cmake cache
相關(guān)文件。同時Makefile
也在build
目錄下生成完畢
- 運行命令行:
make
使用make
工具完成編譯構(gòu)建過程。
三. CMakeLists基本概念
我們知道cmake需要結(jié)合編譯文件CMakeLists.txt進(jìn)行使用,并且CMakeLists.txt的編寫更為重要。因此對CMakeLists.txt的使用和編寫方法進(jìn)行學(xué)習(xí)和掌握至關(guān)重要。在我學(xué)習(xí)的經(jīng)驗中,CMakeLists.txt文件中的內(nèi)容可以總結(jié)為兩點,一是控制編譯的流程,二是提供編譯構(gòu)建過程中所需的命令。
1. 編譯流程的控制
編譯構(gòu)建軟件工程的工具一大作用就是為了程序化軟件化控制編譯的流程。因此cmake提供了大量相關(guān)的概念,如默認(rèn)變量CMAKE_PREFIX_PATH
以及自定義變量等等。其中默認(rèn)變量提供了很多信息,不同的變量有著不一樣的作用,有的表示路徑等信息,有的是用于編譯時提供編譯參數(shù)等等,這一部分很繁雜而且需要根據(jù)實際的使用自己去確定,可以參考官方文檔有個總體概念:https://cmake.org/cmake/help/v2.8.7/cmake.html#section_Variables 。除了默認(rèn)的變量,cmake也支持自己定義變量來提供更多的信息,同時再結(jié)合CMakeListst的控制語句,因此可以根據(jù)需求抽象化整個編譯流程。
2. 編譯構(gòu)建過程中所需的命令
編譯構(gòu)建工具更為重要的作用當(dāng)然就是構(gòu)建工程。而軟件工程的構(gòu)建就少不了解決軟件依賴的問題,即尋找構(gòu)建目標(biāo)所依賴的各種庫。cmake一般是用于構(gòu)建C/C++工程。而C/C++工程的構(gòu)建大致分為三部分,編譯動態(tài)鏈接庫或靜態(tài)鏈接庫,編譯可執(zhí)行程序部分,將可執(zhí)行程序與動態(tài)鏈接庫或靜態(tài)鏈接庫鏈接。因此cmake提供了大量的命令用于這三部分。
- 在編譯動態(tài)鏈接庫或靜態(tài)鏈接庫部分,cmake提供了
add_library
的命令。 - 在編譯可執(zhí)行程序部分,cmake提供了
add_executable
命令。在前面這兩個部分中,又涉及到指定頭文件路徑以及庫文件路徑的需求,因此,cmake提供了include_directories
和link_directories
命令。 - 在將可執(zhí)行程序與動態(tài)鏈接庫或靜態(tài)鏈接庫鏈接的部分,因為涉及到依賴庫的尋找,cmake提供了
find_package
,include
等命令,除此之外也支持通過自定義變量的方法人為設(shè)定依賴庫的路徑。在該部分中,將庫與可執(zhí)行程序進(jìn)行鏈接,cmake則提供了target_link_libraries
命令。 - 在這三部分中,因為還涉及到文件的搜索和處理,cmake也提供文件及字符串相關(guān)的命令。