首頁 > 軟體

CMake基礎教學

2020-06-16 17:40:57

如果需要設定和檢查我們工程中的所有依賴,那麼可以選用CMake工具;但是,這並不是必須的,因為我們可以使用其他的工具或者是IDE(比如Makefiles或者Visual Studio)來設定我們的工程。然而,CMake是最好移植的方式來設定多平台的C++專案。

1. 基本用法

  CMake使用名稱為CMakeLists.txt的檔案,其中定義了編譯和依賴處理等過程。對於一個基本的專案而言,從一個原始碼檔案構建一個可執行程式只需要中CMakeLists.txt檔案中新增兩行程式碼即可。檔案內容像下面這樣:

cmake_minimum_required (VERSION 2.6)
project (CMakeTest)
add_executable (${PROJECT_NAME} main.cpp)

  檔案的第一行定義了所需的CMake版本的最小值,這一行是強制新增在CMakeLists.txt檔案中,其擁有指定了從第二行開始可以使用的給定版本所定義的cmake函數;第二行的project函數用於定義工程名(這裡為CMakeTest),這個名字被儲存在一個名為PROJECT_NAME的變數中。最後一行,在main.cpp檔案中建立一個可執行命令(add_executable()),它的名字和工程名稱(${PROJECT_NAME})相同,然後將原始碼編譯到名稱為CMakeTest的可執行檔案中,也就是將可執行檔名設定為與工程名相同。${}表示式允許存取環境中定義的任何變數,因此,我們可以使用${PROJECT_NAME}變數作為一個可執行程式的輸出名。假設這裡的main.cpp檔案是一個簡單的Hello World程式,程式碼如下:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello World! " << argc << argv[0] << endl;
    return 0;
}

將這兩個檔案放置在同一目錄下,然後依次執行如下命令:

cmake .
make

這樣,我們就可以在當前目錄下面看到一個名稱為CMakeTest的可執行檔案了。

2. 建立庫檔案(Creating a library)

  CMake允許你建立庫檔案,可以被OpenCV編譯系統使用。軟體開發過程中,在多個應用之間共用程式碼是一種通用並且實用的實踐。在大型應用中,或者是當相同的程式碼在多個應用中共用時,這種使用方式非常有用。

  在這種情況下,我們不需要建立一個二進位制可執行檔案;取而代之,我們建立一個編譯好的檔案,其中包含了所有的函數、類等等,使用它來開發。我們可以將這個庫檔案與其它應用共用,而不需要共用我們的原始碼。CMake中包含了一個add_library()函數來實現此目的:

# Create our hello library
add_library(Hello hello.cpp hello.h)
# Create our application that uses our new library
add_executable(executable main.cpp)
# Link our executable with the new library
target_link_libraries(executable Hello)

  以“#”開頭的行為註釋行,這些行會被CMake忽略掉。

  命令add_library(Hello hello.cpp hello.h)定義了我們新建立的庫的名稱,庫名稱為Hello,而hello.cpp和hello.h是庫的原始檔。我們新增標頭檔案以允許IDE連結到這些標頭檔案。執行這一行命令將會產生一個共用檔案(在OS X或者Unix下生成一個*.so檔案,在Windows下生成*.dll檔案),這取決於我們所使用的作業系統,或者是要建立動態庫還是靜態庫。

  target_link_libraries(executable Hello)用於連結我們的可執行檔案executable到目標庫,在這裡,將會連結到Hello庫中。

  假設我們在hello.cpp中定義一個say()函數用於輸出字串,在hello.h檔案中新增此函數的宣告:

1 #include <iostream>
2 #include "hello.h"
3
4 void say(std::string text)
5 {
6    std::cout << text << std::endl;
7 }
 
#ifndef __HELLO_H__
#define __HELLO_H__
#include <string>
void say(std::string text);
#endif

  然後,我們在main.cpp中新增hello.h標頭檔案宣告,然後參照Hello庫中定義的say()函數,程式碼如下:

1 #include "hello.h"
2
3 int main()
4 {
5    say("I can say Hello!");
6    return 0;
7 }

  最後,依次執行“cmake .”和“make”命令,就可以看到最終生成的可執行檔案了,點選執行檢視效果。

3. 管理依賴(Managing dependencies)

  CMake具有搜尋我們的依賴檔案以及外部庫的能力,它為我們提供了編譯複雜工程的基礎設施,

4. 讓指令碼更複雜(Making the script more complex)

  在這一節

使用cmake編譯安裝MySQL 5.5  http://www.linuxidc.com/Linux/2015-12/126541.htm   

CMake快速使用教學 http://www.linuxidc.com/Linux/2015-10/124447.htm

Ubuntu 12.04利用CMake-2.8.10.4編譯OpenCV-2.4.4 http://www.linuxidc.com/Linux/2014-04/100113.htm

CMake並沒有想象中好用 http://www.linuxidc.com/Linux/2014-03/98799.htm

CMake 設定交叉編譯環境 http://www.linuxidc.com/Linux/2014-03/98622.htm

MySQL編譯安裝 之 CMake http://www.linuxidc.com/Linux/2013-09/90113.htm

基於CMake編譯安裝MySQL 5.5  http://www.linuxidc.com/Linux/2013-04/83579.htm


IT145.com E-mail:sddin#qq.com