cmake編譯c++程式
當在Linux系統下編寫程式時候,如果沒有類似於visual studio、vs code等IDE(整合開發環境)時,如何編譯、執行程式呢?一種方法是編寫makefile檔案,用makefile檔案管理程式指令碼之間的相互依賴關係,其語法相對比較複雜。另一種有效的方法就是利用cmake工具,自動生成makefile檔案。
cmake是什麼
CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。Linux/Ubuntu上基本都預先安裝好了cmake工具,用sudo apt-get install也可以自動安裝。要使用cmake必須在工程的每個資料夾中都編寫CMakeLists.txt,尤其注意C、M、L是大寫,並且是複數形式。
hello, world!
話不多說,下面給出利用cmake進行編譯並執行程式的例子,首先在建立一個名為ex1的資料夾,在其中建立程式原始檔main.cpp和CMakeLists.txt
#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的可執行檔案,非常容易。
注意cmake的命令不區分大小寫,但一般建議使用大寫的,然後,cmake的註釋為#。
在terminal中,將路徑改為當前資料夾中,先後執行
$cmake .
$make
此時檔案中,hello檔案,hello檔案是編譯之後的輸出檔案。
$./hello
可以看到輸出結果:
Hello, world!
out-of-source編譯
上述編譯方法有個很大的問題,原本檔案中僅有原始檔和CMakeLists.txt,但是編譯之後,資料夾中的檔案如下所示:CMakeCache.txt cmake_install.cmake hello Makefile
CMakeFiles CMakeLists.txt main.cpp
多了很多編譯過程檔案和結果檔案,這樣的方式顯然是不方便的。如果能夠把編譯的過程檔案和結果檔案放在另一個資料夾,那麼檔案結構就比較清晰,可以方便地編輯、修改原始檔。
建立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!
上面是cmake的入門教程,cmake能夠通過編寫數行命令,編譯程式,對於管理大型的軟體系統很有幫組。