
【軟件介紹】
CMake是一個(gè)跨平臺(tái)的安裝(編譯)工具,可以用簡(jiǎn)單的語(yǔ)句來(lái)描述所有平臺(tái)的安裝(編譯過(guò)程)。他能夠輸出各種各樣的makefile或者project文件,能測(cè)試編譯器所支持的C++特性,類(lèi)似UNIX下的automake。只是 CMake 的組態(tài)檔取名為 CMakeLists.txt。Cmake 并不直接建構(gòu)出最終的軟件,而是產(chǎn)生標(biāo)準(zhǔn)的建構(gòu)檔(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建構(gòu)方式使用。這使得熟悉某個(gè)集成開(kāi)發(fā)環(huán)境(IDE)的開(kāi)發(fā)者可以用標(biāo)準(zhǔn)的方式建構(gòu)他的軟件,這種可以使用各平臺(tái)的原生建構(gòu)系統(tǒng)的能力是 CMake 和 SCons 等其他類(lèi)似系統(tǒng)的區(qū)別之處。
【軟件特色】
1.開(kāi)放源代碼,使用類(lèi) BSD 許可發(fā)布。2.跨平臺(tái),并可生成 native 編譯配置文件,在 Linux/Unix 平臺(tái),生成 makefile,在 蘋(píng)果平臺(tái),可以生成 xcode,在 Windows 平臺(tái),可以生成 MSVC 的工程文件。
3.能夠管理大型項(xiàng)目,KDE4 就是最好的證明。
4.簡(jiǎn)化編譯構(gòu)建過(guò)程和編譯過(guò)程。Cmake 的工具鏈非常簡(jiǎn)單:cmake+make。
5.高效率,按照 KDE 官方說(shuō)法,CMake 構(gòu)建 KDE4 的 kdelibs 要比使用 autotools 來(lái) 構(gòu)建 KDE3.5.6 的 kdelibs 快 40%,主要是因?yàn)?Cmake 在工具鏈中沒(méi)有 li^ool。
6.可擴(kuò)展,可以為 cmake 編寫(xiě)特定功能的模塊,擴(kuò)充 cmake 功能。

【組態(tài)檔】
組態(tài)檔是用一種建構(gòu)軟件專(zhuān)用的特殊編程語(yǔ)言寫(xiě)的CMake腳本。內(nèi)建C語(yǔ)言、C++、Fortran、Java的自動(dòng)相依性分析功能。
經(jīng)由CMake腳本語(yǔ)言支持SWIG、Qt、FLTK。
內(nèi)建對(duì)微軟Visual Studio .NET和過(guò)去的Visual Studio版本的支持,可以產(chǎn)生后綴為.dsp、.sln和.vcproj的文檔。
用傳統(tǒng)的時(shí)間標(biāo)簽偵測(cè)檔案內(nèi)容的改變。
支持平行建構(gòu)(在多臺(tái)電腦上同時(shí)建構(gòu))
在許多操作系統(tǒng)上進(jìn)行跨平臺(tái)編譯,包括Linux、POSIX相容的系統(tǒng)(AIX、*BSD、HP-UX、IRIX、MinGW/MSYS、Solaris系統(tǒng))、Mac OS X和微軟Windows 95/98/NT/2000/XP等。
產(chǎn)生可以給Graphviz用的全局相依圖。
已經(jīng)和Dart、CTest和CPack等軟件測(cè)試和釋出的工具整合。

【使用方法】
CMake的所有的語(yǔ)句都寫(xiě)在一個(gè)叫:CMakeLists.txt 的文件中。當(dāng)CMakeLists.txt文件確定后,可以用ccmake命令對(duì)相關(guān) 的變量值進(jìn)行配置。這個(gè)命令必須指向CMakeLists.txt所在的目錄。配置完成之后,應(yīng)用cmake命令生成相應(yīng)的makefile(在Unix like系統(tǒng)下)或者 project文件(指定用window下的相應(yīng)編程工具編譯時(shí))。其基本操作流程為:
$> ccmake directory
$> cmake directory
$> make
其中directory為CMakeList.txt所在目錄;
第一條語(yǔ)句用于配置編譯選項(xiàng),如VTK_DIR目錄 ,一般這一步不需要配置,直接執(zhí)行第二條語(yǔ)句即可,但當(dāng)出現(xiàn)錯(cuò)誤時(shí),這里就需要認(rèn)為配置了,這一步才真正派上用場(chǎng);
第二條命令用于根據(jù)CMakeLists.txt生成Makefile文件;
第三條命令用于執(zhí)行Makefile文件,編譯程序,生成可執(zhí)行文件;
CMake的執(zhí)行就是這么簡(jiǎn)單,其難點(diǎn)在于如何編寫(xiě)CMakeLists.txt文件,下面結(jié)合例子簡(jiǎn)單介紹CMakeLists.txt的編寫(xiě),看下面這個(gè)CMakeLists.txt
#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#set extern libraries
SET(LIBRARIES
libm.so
)
#add executable file
ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
#add link library
TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES})
或者用下面這個(gè)CMakeLists.txt
#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#add executable file
ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
#add link library
TARGET_LINK_LIBRARIES(../bin/bin m)
這是一個(gè)測(cè)試數(shù)學(xué)函數(shù)的程序的CMakeLists.txt,"#"后面為注釋的內(nèi)容,CMake的命令全部為大寫(xiě)
第2行指定生成的工程名為test_math
第4行指定頭文件目錄為include
第8行指定源文件目錄為src,并將其賦值給環(huán)境變量DIR_SRCS
第10行設(shè)定環(huán)境變量TEST_MATH的值為環(huán)境變量DIR_SRCS的值,此處用于顯示如何用環(huán)境變量對(duì)環(huán)境變量進(jìn)行賦值
第14行將數(shù)學(xué)函數(shù)庫(kù)賦值給環(huán)境變量LIBRARIES,當(dāng)然,可以不用這個(gè)環(huán)境變量,而在后面直接使用該庫(kù)名
第18行用于指定生成文件,將環(huán)境變量TEST_MATH目錄下的所有文件編譯生成../bin目錄下的可執(zhí)行文件bin
第20行指定../bin/bin執(zhí)行時(shí)的鏈接庫(kù)為環(huán)境變量LIBRARIES的值-libm.so
下面給出源文件
/src/main.c:
#include<stdio.h>
#include"../include/a.h"
int main()
{
double b=25.0;
double a=0.0;
a=get_sqrt(b);
printf("a is %lf, b is %lf\n",a,b);
return 0;
}
/src/a.c
#include"../include/a.h"
double get_sqrt(double var1)
{
return sqrt(var1);
}
/include/a.h
#ifndef A_FILE_HEADER_INC
#define A_FILE_HEADER_INC
#include<math.h>
double get_sqrt(double var1);
#endif
將CMakeLists.txt放在當(dāng)前目錄下,執(zhí)行CMakeLists.txt
$> cmake .
$> make
即可生成可執(zhí)行文件,在目錄/bin下的bin文件,好了運(yùn)行看其效果是否和所想一樣。

【使用教程】
配置從本站下載cmake后,我們可以在下載路徑得到一個(gè)壓縮包,如圖所示,解壓此壓縮包,解壓縮有我們可以得到下圖所示的文件。下面我們開(kāi)始配置cmake。


進(jìn)入電腦屬性
在此電腦上右鍵單擊,打開(kāi)右鍵菜單,點(diǎn)擊屬性菜單,如圖所示。

進(jìn)入高級(jí)系統(tǒng)設(shè)置
在屬性頁(yè)面,我們?cè)谧筮吙梢钥吹礁呒?jí)系統(tǒng)設(shè)置選項(xiàng),如圖所示,點(diǎn)擊高級(jí)系統(tǒng)設(shè)置,進(jìn)入高級(jí)系統(tǒng)設(shè)置頁(yè)面。

進(jìn)入環(huán)境變量設(shè)置
在高級(jí)系統(tǒng)設(shè)置頁(yè)面,可以找到環(huán)境變量選項(xiàng),如圖所示,點(diǎn)擊環(huán)境變量,進(jìn)入環(huán)境變量頁(yè)面。

進(jìn)入path變量
在環(huán)境變量頁(yè)面,我們可以看到“系統(tǒng)變量”框,在系統(tǒng)變量部分,我們可以找到path變量,如圖所示,雙擊path變量。打開(kāi)path變量設(shè)置窗口。

設(shè)置path變量
打開(kāi)path變量設(shè)置窗口后,將剛才解壓的文件所在路徑復(fù)制,然后點(diǎn)擊“新建”,在新的欄目中粘貼路徑,點(diǎn)擊“確定”即可。

驗(yàn)證配置是否成功
在命令行輸入"cmake --version",如果輸出如圖所示,即配置成功。

編譯
運(yùn)行GUI的cmake界面:

執(zhí)行Configure:
運(yùn)行之后,生成了如下文件:

生成Makefile:
執(zhí)行Generate之后生成如下文件:

運(yùn)行make進(jìn)行編譯:

編譯完成后,在build目錄生成Tutorial.exe,運(yùn)行Tutorial.exe 25就可以看到運(yùn)行結(jié)果:

運(yùn)行make install安裝程序:

運(yùn)行make test進(jìn)行測(cè)試:

【常見(jiàn)問(wèn)題】
CMake緩存是什么?用戶(hù)在第一次運(yùn)行CMake軟件時(shí),它會(huì)生成一個(gè)CMakeCache.txt文件。此文件包含諸如本機(jī)JPEG庫(kù)的存在和位置之類(lèi)的內(nèi)容。
添加條目以響應(yīng)某些CMake命令(例如FIND_LIBRARY),因?yàn)樗鼈冊(cè)谠礃?shù)中的所有地方在CMakeLists文件中的所有地方處理。
在CMake運(yùn)行后,并創(chuàng)建了一個(gè)CMakeCache.txt文件 - 你可以編輯它。CMake GUI,將允許您輕松地編輯選項(xiàng),或者您可以直接編輯文件。
編輯緩存的主要原因是給予CMake本地庫(kù)(如JPEG)的位置,或者阻止它使用本地庫(kù)并在源代碼樹(shù)中使用庫(kù)的版本。
CMake不能改變緩存文件本身中的現(xiàn)有條目。如果您的CMakeLists.txt文件變化顯著,您將需要從緩存文件中刪除相關(guān)條目。如果你還沒(méi)有手動(dòng)編輯緩存文件,你可以刪除它,而后重新運(yùn)行CMake。
cmake如何處理路徑包含頭文件?
CMake中,添加頭文件路徑,對(duì)應(yīng)的函數(shù)叫includ。然后在參數(shù)中,把所有需要添加的路徑,加進(jìn)去就可以了。
添加庫(kù)路徑,對(duì)應(yīng)的函數(shù)叫LINK_DIR,同樣,在參數(shù)中,把所有的路徑加進(jìn)去就可以了。
CMake中的函數(shù)調(diào)用,是不區(qū)分大小寫(xiě)的,大小寫(xiě)可以混合使用。
添加庫(kù),對(duì)應(yīng)的函數(shù)叫LINK_LIBR,把所有的庫(kù)加進(jìn)去即可。這
里有一個(gè)注意事項(xiàng),這個(gè)不需要我們手動(dòng)添加.lib這個(gè)后綴了,挺方便的。
然后執(zhí)行CMake,生成內(nèi)容。然后這里需要切換到Rele版本,進(jìn)行編譯。生成成功并運(yùn)行。
查看之所以Debug版本編譯有問(wèn)題,發(fā)現(xiàn)依賴(lài)庫(kù)為osg.lib而不是osgd.lib,也就是說(shuō)依賴(lài)庫(kù)是Rele版的。
為何要使用項(xiàng)目構(gòu)建工具?
為何要使用cmake和autotools之類(lèi)的項(xiàng)目構(gòu)建工具? 我想,這恐怕是剛剛接觸軟件項(xiàng)目的人最應(yīng)該問(wèn)的問(wèn)題之一了。
“Hello, world!“這個(gè)最經(jīng)典的程序相信我們每個(gè)人都寫(xiě)過(guò)。無(wú)論在什么平臺(tái)下,編譯和運(yùn)行這個(gè)程序都僅需要非常簡(jiǎn)單的操作。但事實(shí)上,hello,world最多只能算是一個(gè)實(shí)例程序,根本算不上一個(gè)真正的軟件項(xiàng)目。
任何一個(gè)軟件項(xiàng)目,除了寫(xiě)代碼之外,還有一個(gè)更為重要的任務(wù),就是如何組織和管理這些代碼,使項(xiàng)目代碼層次結(jié)構(gòu)清晰易讀,這對(duì)以后的維護(hù)工作大有裨益。使想一下,如果把一個(gè)像KDE4那么大的項(xiàng)目像hello world那樣,把全部代碼都放到一個(gè)main.cpp文件中,那將會(huì)是多么恐怖的一件事情。別說(shuō)KDE4,就是我們隨便一個(gè)幾千行代碼的小項(xiàng)目,也不會(huì)有人干這種蠢事。
決定代碼的組織方式及其編譯方式,也是程序設(shè)計(jì)的一部分。因此,我們需要cmake和autotools這樣的工具來(lái)幫助我們構(gòu)建并維護(hù)項(xiàng)目代碼。
看到這里,也許你會(huì)想到makefile,makefile不就是管理代碼自動(dòng)化編譯的工具嗎?為什么還要用別的構(gòu)建工具?
其實(shí),cmake和autotools正是makefile的上層工具,它們的目的正是為了產(chǎn)生可移植的makefile,并簡(jiǎn)化自己動(dòng)手寫(xiě)makefile時(shí)的巨大工作量。如果你自己動(dòng)手寫(xiě)過(guò)makefile,你會(huì)發(fā)現(xiàn),makefile通常依賴(lài)于你當(dāng)前的編譯平臺(tái),而且編寫(xiě)makefile的工作量比較大,解決依賴(lài)關(guān)系時(shí)也容易出錯(cuò)。因此,對(duì)于大多數(shù)項(xiàng)目,應(yīng)當(dāng)考慮使用更自動(dòng)化一些的cmake或者autotools來(lái)生成makefile,而不是上來(lái)就動(dòng)手編寫(xiě)。

































