當在Linux系統下編寫程序時候,若是沒有相似於visual studio、vs code等IDE(集成開發環境)時,如何編譯、運行程序呢?一種方法是編寫makefile文件,用makefile文件管理程序腳本之間的相互依賴關係,其語法相對比較複雜。另外一種有效的方法就是利用cmake工具,自動生成makefile文件。ios
cmake是什麼
CMake是一個跨平臺的安裝(編譯)工具,能夠用簡單的語句來描述全部平臺的安裝(編譯過程)。Linux/Ubuntu上基本都預先安裝好了cmake工具,用sudo apt-get install也能夠自動安裝。要使用cmake必須在工程的每一個文件夾中都編寫CMakeLists.txt,尤爲注意C、M、L是大寫,而且是複數形式。工具
hello, world!
話很少說,下面給出利用cmake進行編譯並運行程序的例子,首先在創建一個名爲ex1的文件夾,在其中創建程序源文件main.cpp和CMakeLists.txtui
#main.cpp #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }
#CMakeLists.txt
PROJECT(hello_world)
ADD_EXECUTABLE(hello main.cpp)
解釋下上面的CMakeLists.txt,第一句是指生成一個名爲hello_world的工程;第二句爲基於main.cpp生成名爲hello的可執行文件,很是容易。spa
注意cmake的命令不區分大小寫,但通常建議使用大寫的,而後,cmake的註釋爲#。code
在terminal中,將路徑改成當前文件夾中,前後運行blog
$cmake . $make
此時文件中,hello文件,hello文件是編譯以後的輸出文件。開發
$./hello
能夠看到輸出結果:terminal
Hello, world!
out-of-source編譯
上述編譯方法有個很大的問題,本來文件中僅有源文件和CMakeLists.txt,可是編譯以後,文件夾中的文件以下所示:
CMakeCache.txt cmake_install.cmake hello Makefileget
CMakeFiles CMakeLists.txt main.cppio
多了不少編譯過程文件和結果文件,這樣的方式顯然是不方便的。若是可以把編譯的過程文件和結果文件放在另外一個文件夾,那麼文件結構就比較清晰,能夠方便地編輯、修改源文件。
創建ex2文件夾,而且在ex2中創建src文件夾,和build文件夾。
首先,在ex2文件夾中,創建CMakeLists.txt,第一行是創建名爲hello_world的工程,第二行添加src子文件夾
#CMakeLists.txt
PROJECT(hello_world)
ADD_SUBDIRECTORY(src)
而後,進入src文件夾,創建CMakeLists.txt,基於main.cpp生成名爲hello的目標文件。
ADD_EXECUTABLE(hello main.cpp)
一樣,main.cpp與上面相同
#main.cpp #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }
而後,進入ex2/build文件夾,在terminal中
$cmake .. $make
對程序進行編譯,編譯完成後,在build文件夾中生成了編譯文件和src文件,src文件夾中有hello的結果文件,進入src文件夾中,在terminal中
$./hello
能夠看到輸出結果,說明編譯正確
Hello, world!