前言
cmake是kitware公司以及一些開源開發者在開發幾個工具套件(VTK)的過程中所產生的衍生品。后來經過發展,最終形成體系,在2001年成為一個獨立的開放源代碼項目。其官方網站是www.cmake.org,可以通過訪問官方網站來獲得更多關於cmake的信息,而且目前官方的英文文檔比以前有了很大的改進,可以作為實踐中的參考手冊。
cmake的流行離不開KDE4的選擇。KDE開發者在使用autotools近10年之后,終於決定為KDE4項目選擇一個新的工程構建工具。之所以如此,用KDE開發者們自己話來說,就是:只有少數幾個“編譯專家”能夠掌握KDE現在的構建體系。在經歷了unsermake,scons以及cmake的選型和嘗試之后,KDE4最終決定使用cmake作為自己的構建系統。在遷移過程中,進展一場的順利,並獲得了cmake開發者的支持。所以,目前的KDE4開發版本已經完全使用cmake來進行構建。
隨着cmake 在KDE4項目中的成功,越來越多的項目正在使用cmake作為其構建工具,這也使得cmake正在成為一個主流的構建體系。
為何要使用項目構建工具
為何要使用cmake和autotools之類的項目構建工具? 我想,這恐怕是剛剛接觸軟件項目的人最應該問的問題之一了。
“Hello, world!“這個最經典的程序相信我們每個人都寫過。無論在什么平台下,編譯和運行這個程序都僅需要非常簡單的操作。但事實上,hello,world最多只能算是一個實例程序,根本算不上一個真正的軟件項目。
任何一個軟件項目,除了寫代碼之外,還有一個更為重要的任務,就是如何組織和管理這些代碼,使項目代碼層次結構清晰易讀,這對以后的維護工作大有裨益。使想一下,如果把一個像KDE4那么大的項目像hello world那樣,把全部代碼都放到一個main.cpp文件中,那將會是多么恐怖的一件事情。別說KDE4,就是我們隨便一個幾千行代碼的小項目,也不會有人干這種蠢事。
決定代碼的組織方式及其編譯方式,也是程序設計的一部分。因此,我們需要cmake和autotools這樣的工具來幫助我們構建並維護項目代碼。
看到這里,也許你會想到makefile,makefile不就是管理代碼自動化編譯的工具嗎?為什么還要用別的構建工具?
其實,cmake和autotools正是makefile的上層工具,它們的目的正是為了產生可移植的makefile,並簡化自己動手寫makefile時的巨大工作量。如果你自己動手寫過makefile,你會發現,makefile通常依賴於你當前的編譯平台,而且編寫makefile的工作量比較大,解決依賴關系時也容易出錯。因此,對於大多數項目,應當考慮使用更自動化一些的 cmake或者autotools來生成makefile,而不是上來就動手編寫。
總之,項目構建工具能夠幫我們在不同平台上更好地組織和管理我們的代碼及其編譯過程,這是我們使用它的主要原因。
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 功能。
安裝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 下面
Hello, world!
了解cmake的基本原理並在系統中安好cmake后,我們就可以用cmake來演示那個最經典的”Hello, world!”了。
第一步,我們給這個項目起個名字——就叫HELLO吧。因此,第一部為項目代碼建立目錄hello,與此項目有關的所有代碼和文檔都位於此目錄下。
第二步,在hello目錄下建立一個main.c文件,其代碼如下:
#include <stdio.h>
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上的運行過程:
$ 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生成已有項目
1、項目目錄規划
在project_dir下建立build, cmake, src三個目錄。
2、編寫CMakeLists.txt文件。
3、調用CMake命令為eclipse生成項目文件
點擊(此處)折疊或打開
mkdir -p build/release
mkdir -p build/debug
cmake -E chdir build/release cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=release ../../
cmake -E chdir build/debug cmake -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=debug ../../
4、打開eclipse
a. 選擇菜單:
File->Import->General->Existing Projects into Workspace
b. 點擊 “Next”,在 Select root directory 選擇目錄為project_dir/build
Eclipse會自動搜索到debug, release兩個目錄下的項目。
c. 點擊“Finish”按鈕。eclipse將自動加入項目。
- 剩下的就是使用Eclipse CDT 調試程序了。
續
上面,我們提到了一個名詞,叫外部編譯方式。其實,cmake還可以直接在當前目錄進行編譯,無須建立build目錄。但是,這種做法會將所有生成的中間文件和源代碼混在一起,而且cmake生成的makefile無法跟蹤所有的中間文件,即無法使用”make distclean”命令將所有的中間文件刪除。因此,我們推薦建立build目錄進行編譯,所有的中間文件都會生成在build目錄下,需要刪除時直接清空該目錄即可。這就是所謂的外部編譯方式。
轉載網址,多謝原文博主精彩總結,轉載至此,僅為學習方便,無抄襲動機,再次感謝!
