cmake命令 安裝、用法簡介

前言html

cmake是kitware公司以及一些開源開發者在開發幾個工具套件(VTK)的過程當中所產生的衍生品。後來通過發展,最終造成體系,在2001年成爲一個獨立的開放源代碼項目。其官方網站是www.cmake.org,能夠經過訪問官方網站來得到更多關於cmake的信息,並且目前官方的英文文檔比之前有了很大的改進,能夠做爲實踐中的參考手冊。linux

cmake的流行離不開KDE4的選擇。KDE開發者在使用autotools近10年以後,終於決定爲KDE4項目選擇一個新的工程構建工具。之因此如此,用KDE開發者們本身話來講,就是:只有少數幾個「編譯專家」可以掌握KDE如今的構建體系。在經歷了unsermake,scons以及cmake的選型和嘗試以後,KDE4最終決定使用cmake做爲本身的構建系統。在遷移過程當中,進展一場的順利,並得到了cmake開發者的支持。因此,目前的KDE4開發版本已經徹底使用cmake來進行構建。c++

隨着cmake 在KDE4項目中的成功,愈來愈多的項目正在使用cmake做爲其構建工具,這也使得cmake正在成爲一個主流的構建體系。shell

1、爲什麼要使用項目構建工具?編程

爲什麼要使用cmake和autotools之類的項目構建工具? 我想,這恐怕是剛剛接觸軟件項目的人最應該問的問題之一了。bootstrap

「Hello, world!「這個最經典的程序相信咱們每一個人都寫過。不管在什麼平臺下,編譯和運行這個程序都僅須要很是簡單的操做。但事實上,hello,world最多隻能算是一個實例程序,根本算不上一個真正的軟件項目。ubuntu

任何一個軟件項目,除了寫代碼以外,還有一個更爲重要的任務,就是如何組織和管理這些代碼,使項目代碼層次結構清晰易讀,這對之後的維護工做大有裨益。使想一下,若是把一個像KDE4那麼大的項目像hello world那樣,把所有代碼都放到一個main.cpp文件中,那將會是多麼恐怖的一件事情。別說KDE4,就是咱們隨便一個幾千行代碼的小項目,也不會有人幹這種蠢事。windows

決定代碼的組織方式及其編譯方式,也是程序設計的一部分。所以,咱們須要cmake和autotools這樣的工具來幫助咱們構建並維護項目代碼。
看到這裏,也許你會想到makefile,makefile不就是管理代碼自動化編譯的工具嗎?爲何還要用別的構建工具?xcode

其實,cmake和autotools正是makefile的上層工具,它們的目的正是爲了產生可移植的makefile,並簡化本身動手寫makefile時的巨大工做量。若是你本身動手寫過makefile,你會發現,makefile一般依賴於你當前的編譯平臺,並且編寫makefile的工做量比較大,解決依賴關係時也容易出錯。所以,對於大多數項目,應當考慮使用更自動化一些的 cmake或者autotools來生成makefile,而不是上來就動手編寫。bash

總之,項目構建工具可以幫咱們在不一樣平臺上更好地組織和管理咱們的代碼及其編譯過程,這是咱們使用它的主要緣由。

2、cmake的主要特色:

cmake和autotools是不一樣的項目管理工具,有各自的特色和用戶羣。存在即爲合理,所以咱們不會對二者進行優劣比較,這裏只給出cmake的一些主要特色:
1.開放源代碼,使用類 BSD 許可發佈。
2.跨平臺,並可生成 native 編譯配置文件,在 Linux/Unix 平臺,生成 makefile,在 蘋果平臺,能夠生成 xcode,在 Windows 平臺,能夠生成 MSVC 的工程文件。
3.可以管理大型項目,KDE4 就是最好的證實。
4.簡化編譯構建過程和編譯過程。Cmake 的工具鏈很是簡單:cmake+make。
5.高效率,按照 KDE 官方說法,CMake 構建 KDE4 的 kdelibs 要比使用 autotools 來 構建 KDE3.5.6 的 kdelibs 快 40%,主要是由於 Cmake 在工具鏈中沒有 libtool。
6.可擴展,能夠爲 cmake 編寫特定功能的模塊,擴充 cmake 功能。

3、安裝cmake

安裝cmake 對任何用戶而言都不應再成爲一個問題。幾乎全部主流的Linux發行版的源中都包含有cmake的安裝包,直接從源中添加便可。固然,也能夠在官方網站下載源代碼自行編譯安裝。

對於Windows和Mac用戶,cmake的官方網站上有相應的安裝包,下載安裝便可,無須贅述。

注:爲了可以測試本文中的實例程序,若是讀者的Linux系統中所帶的cmake版本低於2.6,請從官網下載2.6版本或以上的源代碼進行編譯並安裝。
在linux下安裝cmake

首先下載源碼包
http://www.cmake.org/cmake/resources/software.html

這裏下載的是cmake-2.6.4.tar.gz

隨便找個目錄解壓縮

tar -xzvf cmake-2.6.4.tar.gz 
cd cmake-2.6.4
 

依次執行:

./bootstrap 
make 
make install
 

cmake 會默認安裝在 /usr/local/bin 下面

4、從「Hello, world!」開始

瞭解cmake的基本原理並在系統中安好cmake後,咱們就能夠用cmake來演示那個最經典的」Hello, world!」了。

第一步,咱們給這個項目起個名字——就叫HELLO吧。所以,第一部爲項目代碼創建目錄hello,與此項目有關的全部代碼和文檔都位於此目錄下。

第二步,在hello目錄下創建一個main.c文件,其代碼以下:

 
#include 
int main(void) 
{ 
   printf(」Hello,World\n」); 
   return 0; 
}

第三步,在hello目錄下創建一個新的文件CMakeLists.txt,它就是 cmake所處理的「代碼「。其實,使用cmake管理項目自己也是在編程,因此稱之爲「代碼(或腳本)」並不爲過。在CMakeLists.txt文件中輸入下面的代碼(#後面的內容爲代碼行註釋):
#cmake最低版本需求,不加入此行會受到警告信息
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(HELLO) #項目名稱
#把當前目錄(.)下全部源代碼文件和頭文件加入變量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
#生成應用程序 hello (在windows下會自動生成hello.exe)
ADD_EXECUTABLE(hello ${SRC_LIST})

至此,整個hello項目就已經構建完畢,能夠進行編譯了。

第四步,編譯項目。

爲了使用外部編譯方式編譯項目,須要先在目錄hello下新建一個目錄build(也能夠是其餘任何目錄名)。如今,項目總體的目錄結構爲:
hello/
|– CMakeLists.txt
|– build /
`– main.c

在windows下,cmake提供了圖形界面,設定hello爲source目錄,build爲二進制目錄,而後點擊configure便可開始構建,以後進入build目錄運行make命令編譯。

在linux命令行下,首先進入目錄build,而後運行命令(注:後面的「..」不可缺乏):

該命令使cmake檢測編譯環境,並生成相應的makefile。接着,運行命令make進行編譯。編譯後,生成的全部中間文件和可執行文件會在build目錄下。 下面是我在ubuntu上的運行過程:

[code lang="shell"]
$ ls
hello
$ cd hello/build/
$ ls
$ cmake ..
– The C compiler identification is GNU
– The CXX compiler identification is GNU
– Check for working C compiler: /usr/bin/gcc
– Check for working C compiler: /usr/bin/gcc — works
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working CXX compiler: /usr/bin/c++
– Check for working CXX compiler: /usr/bin/c++ — works
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Configuring done
– Generating done
– Build files have been written to: /home/kermit/Project/cmake/hello/build
$ make
Scanning dependencies of target hello
[100%] Building C object CMakeFiles/hello.dir/main.c.o
Linking C executable hello
[100%] Built target hello
$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile
$ ./hello
Hello,World

上面,咱們提到了一個名詞,叫外部編譯方式。其實,cmake還能夠直接在當前目錄進行編譯,無須創建build目錄。可是,這種作法會將全部生成的中間文件和源代碼混在一塊兒,並且cmake生成的makefile沒法跟蹤全部的中間文件,即沒法使用」make distclean」命令將全部的中間文件刪除。所以,咱們推薦創建build目錄進行編譯,全部的中間文件都會生成在build目錄下,須要刪除時直接清空該目錄便可。這就是所謂的外部編譯方式。

相關文章
相關標籤/搜索