Cmake的介紹和使用 Cmake實踐 – 吾嘗終日而思矣 不如須臾之所學也 – C++部落格

來源:互聯網
上載者:User

Cmake的介紹和使用 Cmake實踐 - 吾嘗終日而思矣 不如須臾之所學也 - C++部落格

Cmake的介紹和使用 Cmake實踐

Cmake優點:

1.       開發原始碼,實用類BSD許可發布。

2.       跨平台,並可以產生native編譯設定檔,在linux/unix平台,產生makefile,在mac平台可以產生xcode,在windows平台可以產生msvc工程的設定檔。

3.       能夠管理大型項目

4.       簡化編譯構建過程和編譯過程,只需要cmake+make就可以

5.       高效率

6.       可擴充,可以為cmake編寫特定功能的模組,擴充cmake功能

如何安裝cmake

1.       Cmake的安裝可以使用autotools進行安裝,點擊cmake-2.8.6.tar.gz 連結,可以對軟體進行下載。

2.       ./configure

3.       make

4.       sudo make install

 

Cmake的原理

 

Helloworld cmake

//main.cpp

#include<cstdio>

 

int main()

{

    printf("hello world from main\n");

    return 0;

}

 

建立CMakeLists.txt(注意大小寫一個字母都不能錯)

向該檔案中加入以下幾行(稍後會做解釋)

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

運行以下命令:

cmake . (別忘記加上這個點,表示目前的目錄)


注意執行完這句話之後會產生幾個檔案如下:


CMakeFiles, CMakeCache.txt, cmake_install.cmake等檔案,並且產生了Makefile

然後執行make 就可以產生可執行檔hello


這是目前的目錄下就會產生可執行檔如:


對例子的解釋:

CMakeLists.txt的內容如下:

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

 

Project的指令的文法是:

PROJECT(projectname [CXX] [C] [JAVA])

這個執行是用來定義工程的名稱的和定義工程支援的語言。這個指令也隱式的定義了兩個cmake變數:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,這裡就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,兩個變數指的都是當前工程的路徑。

SET指令的文法:

SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])

Set指令是用來顯式的定義變數的,我們之前用到的是SET(SRC_LIST main.cpp)如果有多個源檔案,也可以定義成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。

 

MESSAGE指令的文法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

這個指令用於向終端輸出使用者資訊,包含三種類型:

SEND_ERROR,產生錯誤,產生過程被跳過。

SATUS,輸出首碼為-的資訊。

FATAL_ERROR,立即終止所有cmake過程。

我們在這裡使用的是STATUS資訊輸出,顯示了由PROJECT指令頂一頂兩個飲食變數HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

 

ADD_EXECUTABLE(hello ${SRC_LIST})

定義了這個工程會產生一個檔案名稱為hello的可執行檔,相關的源檔案是SRC_LIST中定義的源檔案清單,本例中你可以直接寫成ADD_EXECUTABLE(hello main.c)。

 

將本例改寫成一個最簡化的CMakeLists.txt:

PROJECT(HELLO)

ADD_EXECUTABLE(hello main.c)

 

下面我們介紹一個比較實用的例子,即包含產生靜態庫又包含引入外部標頭檔和連結庫的cmake demo。

先按照工程規範建立工程目錄,並編寫代碼,以下面的工程目錄為例進行解釋這個例子,工程的目錄結構為:

 

 

編譯工程要實現的目標:

1. 添加子目錄doc,用以放置這個工程的文檔hello.txt

2. 產生hello的靜態庫,並在main可執行程式連結hello靜態庫

3. 在這個工程中添加COPYRIGHT,README

4. 在工程目錄中添加一個run.sh的指令碼,用以調用產生的二進位可執行檔

5. 將產生的二進位檔案產生到bin子目錄中

6. 編寫安裝程式

 

1. 編寫CMakeLists.txt

由於一個工程目錄中包含多重專案,其中在此項目中包含util項目和main項目,其中util項目是用以產生main程式需要的靜態庫,main是用以產生可執行檔。

在工程項目中的父目錄向有一個CMakeLists.txt是用以聲明定義工程需要的Cmake設定還定義了子目錄src,用以遞迴的調用src中的MakeLists.txt。其中工程目錄的CMakeLists.txt內容定義如下:

PROJECT(HELLO)

ADD_SUBDIRECTORY(src)

在src裡面的CMakeLists.txt是用以定義src目錄包含的兩個工程的依賴關係分別進行編譯。

util目錄裡面的CMakeLists.txt是用以定義產生util靜態庫的規則,其中內容如下:

SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)

SET(CMAKE_C_COMPILER g++)

SET(SRC_LIST hello.c)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

ADD_LIBRARY(util STATIC ${SRC_LIST})

其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定義了庫產生的路徑,LIBRARY_OUTPUT_PATH是一個內部變數,存放庫產生路徑。

SET(SRC_LIST hello.c)是用來定義庫檔案需要的源檔案。

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用來定義非標準庫標頭檔要搜尋的路徑。其中INCLUDE_DIRECTORIES命令的格式為:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

ADD_LIBRARY(util STATIC ${SRC_LIST})是用來定義產生的庫的名字,以及產生庫的類型和產生庫需要的源檔案,其中ADD_LIBRARY命令格式為:

     ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]

          [EXCLUDE_FROM_ALL]

                source1 source2 ... sourceN)

SET(CMAKE_C_COMPILER g++)是用來定義c的編譯器為g++,防止出現C和C++代碼在不指定C編譯器的情況下預設使用gcc,導致系統編譯混亂。

在main目錄中的CMakeLists.txt是用來定義可執行程式編譯和連結時所需要的一些命令或環境。內容如下:

SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)

SET(SRC_LIST main.cpp)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)

 

ADD_EXECUTABLE(hello ${SRC_LIST})

TARGET_LINK_LIBRARIES(hello util)

INCLUDE_DIRECTORIES命令是定義工程的include檔案夾,其中存放使用到的庫的標頭檔,LINK_DIRECTORIES是定義工程的庫檔案,其中存放著庫檔案,ADD_EXECUTABLE是定義產生的可執行檔,TARGET_LINK_LIBRARIES用以定義連結時需要的庫檔案。

2.在工程目錄下建立build目錄,並採用out-of-source方式編譯項目。執行命令make ..,執行結果如下:


執行make,這時在build目錄下產生了中間編譯檔案:


執行make命令,結果如下:


可以看到工程建立和編譯成功了。

2. 安裝

在工程目錄下添加COPYRIGHT、README、和run.sh,重新編輯工程目錄下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)

INSTALL(PROGRAMS run.sh DESTINATION bin)

INSTALL(PROGRAMS bin/hello DESTINATION bin)

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)

這些命令表示在執行make install命令時,安裝程式會拷貝相應的檔案、目錄或程式到指定的首碼開始的目錄中,cmake執行命令如下:

cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..這時將工程目錄安裝到~/data/cmake_demo目錄下。執行結果如下:


其中cmake編譯c、c++工程完畢。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.