1. 程式人生 > >cmake編譯c++程式

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能夠通過編寫數行命令,編譯程式,對於管理大型的軟體系統很有幫組。