CMake使用教程


 
CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。
通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。
總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。
 
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 在工具鏈中沒有 li^ool。

  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

    Unix/Linux用戶下載cmake-2.*.tar.gz

    Windows用戶的下載文件有3種,可任選一種:

     (1)Windows Source (has \r\n line feeds)    cmake-2.8.4.zip CMake的源碼文件里面含有測試實例

     (2)Windows (Win32 Installer)    cmake-2.8.4-win32-x86.exe CMake的安裝文件,直接安裝即可

     (3)Windows ZIP    cmake-2.8.4-win32-x86.zip CMake的綠色版軟件,免安裝。


  隨便找個目錄解壓縮

  tar -xzvf cmake-2.*.tar.gz

  cd cmake-2.*

  依次執行:

  ./bootstrap

  make

  make install

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

  四、從“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_MINIMUM_REQUIRED(VERSION 2.6) #cmake最低版本需求,不加入此行會受到警告信息

  PROJECT(HELLO) #項目名稱  

  AUX_SOURCE_DIRECTORY(. SRC_LIST) #把當前目錄(.)下所有源代碼文件和頭文件加入變量SRC_LIST

  ADD_EXECUTABLE(hello ${SRC_LIST}) #生成應用程序 hello (在windows下會自動生成hello.exe)

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

  第四步,編譯項目。

  為了使用外部編譯方式編譯項目,需要先在目錄hello下新建一個目錄build(也可以是其他任何目錄名)。現在,項目整體的目錄結構為:

  hello/

  |– CMakeLists.txt

  |– build /

  `– main.c

  在windows下,cmake提供了圖形界面,設定hello為source目錄,build為二進制目錄,然后點擊configure即可開始構建。編譯可以在VC++2008下進行,具體見后面的詳述。

 


  在linux命令行下,首先進入目錄build,然后運行命令(注:后面的“..”不可缺少):

  cmake ..

  該命令使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還可以直接在當前目錄進行編譯,無須建立build目錄。但是,這種做法會將所有生成的中間文件和源代碼混在一起,而且cmake生成的makefile無法跟蹤所有的中間文件,即無法使用”make distclean”命令將所有的中間文件刪除。因此,我們推薦建立build目錄進行編譯,所有的中間文件都會生成在build目錄下,需要刪除時直接清空該目錄即可。這就是所謂的外部編譯方式。

 

 

 

下面主要介紹在Windows平台下CMake的編譯和最常用的三個命令,分別是cmake_minimum_required; project; add_executable等。 

CMake是個好東西,在使用VTK, ITK, IGSTK, OpenCV, DCMTK等開源工具包時,是離不開CMake的,甚至有時你使用 FLTK , Qt等界面開發工具時,也經常會看到CMake,你會發現在好多目錄下會有一個文件”CMakeLists.txt”,這個文件就是使用CMake構建工程環境的重要文件。了解一點關於CMake的內容,對使用以上提到的一些開源工具包是灰常有幫助的,而且你會發現,CMake用久了,你會覺得它是很可愛很好用的東西。

廢話少說,結合我個人在使用CMake的過程中,把CMake的一些知識梳理一下,希望對大家有所幫助,如果有不對的地方,請你留言或者發郵件告訴我(水靈,msn: shuiling119@hotmail.com,QQ: 348774226)。

如果你檢索到了我關於CMake的這些文章時,我是假定你已經對CMake的作用有所了解。下面我們從最簡單的入手來看看CMake怎么使用:寫一個HelloCMake.cpp文件,里面就簡單地輸出一行字符串:”Study CMake Together - Hello CMake!”,一起看看怎么用CMake來構建工程。

首先,在使用CMake之前請先從CMake網站(http://www.cmake.org)上下載最新版的安裝文件並在你的機子上安裝,你也可以下載CMake源碼,然后在你機子上編譯;對於使用CMake的童鞋,建議用傻瓜式安裝方式就行了(這里所做的例子全是在Windows 7平台上的。)

然后,還要確保你的機子已經安裝了一種編譯器,我機子上安裝的是VS2008。你也可以選擇其他編譯器,建議用VS2008或以上版本的,個人覺得比較好用。

接着在你機子的某個盤里建一個新的文件夾,如我這里的完整路徑是:D:\CMake\CMake-Study\HelloCMake; 然后在HelloCMake文件夾里建立一個HelloCMake.cpp文件,里面的代碼如下:

#include <iostream>

int main()

{

std::cout<<"Study CMake Together - Hello CMake!"<<std::endl;

return 0;

}

然后在HelloCMake文件夾里建立一個CMakeLists.txt文件,注意文件名不能是別的,必須叫這個名字。里面的內容如下:

cmake_minimum_required(VERSION 2.6)

project(HelloCmake)

add_executable(HelloCMake hellocmake.cpp)

接着在HelloCMake的同級目錄里建立一個新的文件夾,就叫做HelloCMake-bin,在我機子上的完整路徑是:D:\CMake\CMake-Study\HelloCMake-bin,你可以針對自己的目錄路徑對號入座。然后打開CMake程序,界面如圖(1):
CMake之初級教程

圖(1)  

CMake之初級教程
圖(2)

接着把包含CMakeLists.txt和HelloCMake.cpp文件的完整路徑給”where is the source code”,把最后建立的HelloCMake-bin目錄的完整路徑給”where to build the binaries”,然后按Cofigure,界面如圖(2)。

Configure完了以后,選項可能為紅色,重復按Configure命令,直到所有的紅色選項都變成灰色為止,最后再按Generate命令。界面如圖(3)。然后打開HelloCMake-bin,你會發現原來空的文件夾里面自動生成了好多文件,如圖(4),圖(4)中的文件有些是在最后編譯完成后生成的。
CMake之初級教程

圖(3)

CMake之初級教程

圖(4)

到此為止,工程構建完成,打開HelloCMake-bin目錄下的HelloCMake.sln,里面有三個工程,分別是:ALL_BUILD;HelloCMake;ZERO_CHECK。這三個工程的大概作用如下(個人理解而已),HelloCMake就不用說了,自己要建立的那個工程;ALL_BUILD是管理整個項目的工程;ZERO_CHECK是實時監視CMakeLists.txt文件變化的工程,一旦CMakeLists.txt里的內容發生了任何變化,ZERO_CHECK就會告訴編譯器要重新構建整個工程環境。所以,你可以先把工程關掉,打開CMakeLists.txt文件,更改里面的內容以后,把根據以上說的步驟走一遍CMake;你也可以在編譯器環境(如VS2008)中更改CMakeLists.txt文件,然后直接F7編譯工程。如果你選擇后者,你會發現如圖(5)所示的現象發生。

因為你改變了CMakeLists.txt的內容,工程的環境要重新構建、設置。所以你必須加載新的工程環境設置。點Yes,然后點Reload。重新加載設置過的工程環境。

另外一個經常看某些童鞋問的,就是當彈出圖(6)所示的界面時要怎么辦?能怎么辦?界面上提示已經非常清楚了,指定exe的路徑給它,然后點OK就可以了;出現這種情況的原因是你在CMakeLists.txt文件里沒有添加了add_executable(HelloCMake hellocmake.cpp)命令;另外可能是你沒有把生成exe可執行文件的工程設為啟動工程了,如圖(6)所示,你會發現ALL_BUILD這個工程名字是黑體顯示的,表示它是啟動工程;或者你把生成exe可執行文件的工程,如這里的HelloCMake右擊->設置為啟動工程,也不會出現如圖(6)所示的界面。

好,這些比較瑣碎的東西介紹完,我們一起來看看CMakeLists.txt里面的代碼表示什么意思,爭取每句代碼都作解釋,如果有不對的地方,一定要告訴我!
CMake之初級教程

圖(5)

CMake之初級教程

圖(6)

把CMakeLists.txt里的內容再羅列出來:

1. cmake_minimum_required(VERSION 2.6)

2. project(HelloCmake)

3. add_executable(HelloCMake hellocmake.cpp)

第1行,cmake_minimum_required(VERSION 2.6)這是對CMake版本的要求,基本上每個CMakeLists.txt文件里都會有這句代碼,cmake_minimum_required是cmake里的命令,可大寫小寫。VERSION這個關鍵字必須是大寫,而且不能省略;2.6就是CMake的版本號,現在的版本是2.8.3。

第2行,project(HelloCmake),project也是CMake的命令,里面的參數HelloCMake是你要生成的工程的名字,換句話說就是生成的***.sln或者***.dsw等工程項目文件的名字。

第3行,add_executable(HelloCMake hellocmake.cpp),add_executable同樣是CMake的命令,鏈接有關的源文件,然后生成exe可執行文件,這是這個命令的作用。第一個參數是生成的exe文件的文件名,一般與project里的工程名一致,這樣編譯生成的文件就分別是HelloCMake.sln和HelloCMake.exe,當然也可以不一樣。Add_executable()后面的是一個參數列表,可帶多個要編譯的文件名,中間以空格或回車等隔開,如可以加入:

add_executable(HelloCMake hellocmake.cpp hellocmake.h)

 
准備活動:
(1)安裝cmake。
根據自己的需要下載相應的包即可,Windows下可以下載zip壓縮的綠色版本,還可以下載源代碼。
(2)運行cmake的方法。(GUI、命令行)

CMake使用步驟:
運行GUI的cmake界面:
cmake-2.8.1-win32-x86/bin/cmake-gui.exe

執行Configure:
運行之后,生成了如下文件:

生成Makefile:
執行Generate之后生成如下文件:
運行make進行編譯:
編譯完成后,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果:
運行make install安裝程序:
運行make test進行測試:
 
通過cmake tutorial學習CMake配置方法
http://www.cmake.org/cmake/help/cmake_tutorial.html
可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。
1、Step1。
(如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面“CMake使用步驟”的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。)
簡單的程序編譯。
(1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。
(2)點擊Configure,配置成功后,再點擊Generate。
配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。
(3)在build3目錄執行make,就能夠編譯生成Turorial.exe了。
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>make
Linking CXX executable Tutorial.exe
[100%] Built target Tutorial
可以運行一下Turorial.exe:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>Tutorial.exe
Tutorial.exe Version 1.0
Usage: Tutorial.exe number
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>Tutorial.exe 4
The square root of 4 is 2
2、Step2
把子目錄編譯為庫,並且鏈接到最終的可執行文件。
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") 
add_subdirectory (MathFunctions) # 使得子目錄MathFunctions也能被編譯
 
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
產生makefile:
在GUI上點擊Configure,之后Generate還是灰色,再次點擊Configure,Generate就可以點擊了。
編譯:
在build目錄運行make,即可開始編譯,但是開始會報告sh.exe運行異常,應該是Tools下的UnxUtils的sh.exe與Win7不兼容,發現有如下make文件,估計是它導致的,於是把它重命名,不使用UnxUtils下的make,就OK樂。
D:/Tools/CMD/UnxUtils/usr/local/wbin/make.exe
編譯過程:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step2/build>make
[ 50%] Building CXX object MathFunctions/CMakeFiles/MathFunctions.dir/mysqrt.cxx
.obj
Linking CXX static library libMathFunctions.a
[ 50%] Built target MathFunctions
Linking CXX executable Tutorial.exe
[100%] Built target Tutorial

3、Step3
支持make install把程序安裝到系統指定目錄,並且運行一些測試檢查它是否能夠正常工作。
a、安裝時使用的基礎目錄,由CMAKE_INSTALL_PREFIX指定。
b、可以通過一個很簡單的用例檢查程序是否運行起來,沒有出現異常。(TurotialRuns只是一個用例名字)
add_test (TutorialRuns Tutorial 25)
c、macro方式進行多組數據的測試是非常簡潔方便的。
#define a macro to simplify adding tests, then use it
macro (do_test arg result)
add_test (TutorialComp${arg} Tutorial ${arg})
set_tests_properties (TutorialComp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
 
# do a bunch of result based tests
do_test (25 "25 is 5")
do_test (-25 "-25 is 0")
執行make install:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make install
[ 50%] "Built target MathFunctions"
[100%] "Built target Tutorial"
Install the project...
-- Install configuration: ""
-- Installing: C:/Program Files/Tutorial/bin/Tutorial.exe
-- Installing: C:/Program Files/Tutorial/include/TutorialConfig.h
-- Installing: C:/Program Files/Tutorial/bin/libMathFunctions.a
-- Installing: C:/Program Files/Tutorial/include/MathFunctions.h
安裝結果:
C:/Program Files/Tutorial>tree /f
C:.
├─bin
│ libMathFunctions.a
│ Tutorial.exe

└─include
MathFunctions.h
TutorialConfig.h
執行make test:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make test
Running tests...
Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
Start 1: TutorialRuns
1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
Start 2: TutorialComp25
2/5 Test #2: TutorialComp25 ................... Passed 0.01 sec
Start 3: TutorialNegative
3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
Start 4: TutorialSmall
4/5 Test #4: TutorialSmall .................... Passed 0.00 sec
Start 5: TutorialUsage
5/5 Test #5: TutorialUsage .................... Passed 0.00 sec
 
100% tests passed, 0 tests failed out of 5
 
Total Test time (real) = 0.13 sec
修改一個測試用例,讓它不過:
修改頂層CMakeLists.txt,然后重新Configure和Generate,然后make test即可看到結果。
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make test
Running tests...
Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
Start 1: TutorialRuns
1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
Start 2: TutorialComp25
2/5 Test #2: TutorialComp25 ...................***Failed Required regular expre
ssion not found.Regex=[25 is 3
] 0.01 sec
Start 3: TutorialNegative
3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
Start 4: TutorialSmall
4/5 Test #4: TutorialSmall .................... Passed 0.01 sec
Start 5: TutorialUsage
5/5 Test #5: TutorialUsage .................... Passed 0.01 sec
 
80% tests passed, 1 tests failed out of 5
 
Total Test time (real) = 0.13 sec
 
The following tests FAILED:
2 - TutorialComp25 (Failed)
Errors while running CTest
make: *** [test] Error 8

4、Step4
檢查系統是否支持log和exp函數。(log和exp都是數學運算函數)
檢查方法:
(1)頂層配置中使用CheckFunctionExists.cmake
# does this system provide the log and exp functions?
include (CheckFunctionExists.cmake)
check_function_exists (log HAVE_LOG)
check_function_exists (exp HAVE_EXP)
(2)修改.in文件,定義宏。(修改TutorialConfig.h.in,cmake執行中會把宏定義為合適的值,生成TurorialConfig.h,供編譯時使用)
// does the platform provide exp and log functions?
#cmakedefine HAVE_LOG
#cmakedefine HAVE_EXP
(3)在代碼中使用宏和log函數等。
// if we have both log and exp then use them
#if defined (HAVE_LOG) && defined (HAVE_EXP)
result = exp(log(x)*0.5);
#else // otherwise use an iterative approach
Step4的完整配置、生成Makefile、編譯、運行、安裝、測試過程,參見最前面的“CMake使用步驟”。

5、Step5
動態生成源文件,自動把源文件編譯進系統中。
make的時候出錯了:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step5/build>make
Scanning dependencies of target MakeTable
[ 25%] Building CXX object MathFunctions/CMakeFiles/MakeTable.dir/MakeTable.cxx.
obj
Linking CXX executable MakeTable.exe
[ 25%] "Built target MakeTable"
[ 50%] Generating Table.h
'.' 不是內部或外部命令,也不是可運行的程序
或批處理文件。
make[2]: *** [MathFunctions/Table.h] Error 1
make[1]: *** [MathFunctions/CMakeFiles/MathFunctions.dir/all] Error 2
make: *** [all] Error 2
問題分析:
首先看build/makefile文件,關於MakeTable有如下規則:
# Build rule for target.
MakeTable: cmake_check_build_system
$(MAKE) -f CMakeFiles/Makefile2 MakeTable
.PHONY : MakeTable
再看Makefile2文件,找到出錯時正在編譯的目標。
# All Build rule for target.
MathFunctions/CMakeFiles/MakeTable.dir/all:
$(MAKE) -f MathFunctions/CMakeFiles/MakeTable.dir/build.make MathFunctions/CMakeFiles/MakeTable.dir/depend
$(MAKE) -f MathFunctions/CMakeFiles/MakeTable.dir/build.make MathFunctions/CMakeFiles/MakeTable.dir/build
$(CMAKE_COMMAND) -E cmake_progress_report D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step5/build/CMakeFiles 1
@echo "Built target MakeTable"
.PHONY : MathFunctions/CMakeFiles/MakeTable.dir/all
Make規則的執行順序是按照命令的先后順序:
如果Makefile內容如下:
all:
echo "First line."
echo "Second line."
那么make結果:
D:/Users/Desktop>make
echo "First line."
First line.
echo "Second line."
Second line.
由此,Built target MakeTable輸出之后才失敗的。

6、Step6
生成各種平台Windows/Ubuntu/etc.上的安裝包,包括二進制安裝包和源碼安裝包。
可以把依賴的系統庫也打包。include (InstallRequiredSystemLibraries)
使用CPack。
由於Step1-7,后面一步的配置都包含了前面一步的配置,所以從Step5開始,就會遇到make的問題。
為了編譯通過,可以修改MathFunctions目錄下的CMakeLists.txt和mysqrt.cxx,去掉所有對Table.h 的依賴。
運行make package可以生成安裝包:
第一次,因為沒有安裝nsis,提示如下問題:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package
[ 50%] "Built target MathFunctions"
[100%] "Built target Tutorial"
Run CPack packaging tool...
CPack Error: Cannot find NSIS registry value. This is usually caused by NSIS not
being installed. Please install NSIS from http://nsis.sourceforge.net
CPack Error: Cannot initialize the generator NSIS
make: *** [package] Error 1
安裝NSIS之后,運行成功:
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package
[ 50%] "Built target MathFunctions"
[100%] "Built target Tutorial"
Run CPack packaging tool...
CPack: Create package using NSIS
CPack: Install projects
CPack: - Run preinstall target for: Tutorial
CPack: - Install project: Tutorial
CPack: Compress package
CPack: Finalize package
CPack: Package D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build/T
utorial-1.0.1-win32.exe generated.
生成了如下的Windows安裝包文件:
安裝完成后,還可以很方便的卸載它:
運行make package_source可以產生源代碼包。(我的電腦上提示找不到合適的zip程序)
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package_sou
rce
Run CPack packaging tool for source...
CPack Error: Cannot find a suitable ZIP program
CPack Error: Cannot initialize the generator ZIP
make: *** [package_source] Error 1
7、Step7
把結果發布到dashboard。
下面網址是一個公開的dashboard:
http://www.cdash.org/CDash/index.php?project=PublicDashboard
dashboard上顯示的項目名稱通過如下方式設置:
需要先把cmake/bin目錄加入path中,然后執行ctest -D Experimental。這里遇到了一個錯誤。
D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build>ctest -D Experim
ental
Site: JELLY-PC2
Build name: Win32-make
Create new tag: 20100521-1833 - Experimental
Configure project
Each . represents 1024 bytes of output
. Size of output: 0K
Build project
Each symbol represents 1024 bytes of output.
'!' represents an error and '*' a warning.
. Size of output: 0K
0 Compiler errors
0 Compiler warnings
Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build
Start 1: TutorialRuns
1/9 Test #1: TutorialRuns ..................... Passed 0.01 sec
Start 2: TutorialUsage
2/9 Test #2: TutorialUsage .................... Passed 0.01 sec
Start 3: TutorialComp4
3/9 Test #3: TutorialComp4 .................... Passed 0.01 sec
Start 4: TutorialComp9
4/9 Test #4: TutorialComp9 .................... Passed 0.01 sec
Start 5: TutorialComp5
5/9 Test #5: TutorialComp5 .................... Passed 0.01 sec
Start 6: TutorialComp7
6/9 Test #6: TutorialComp7 .................... Passed 0.01 sec
Start 7: TutorialComp25
7/9 Test #7: TutorialComp25 ................... Passed 0.01 sec
Start 8: TutorialComp-25
8/9 Test #8: TutorialComp-25 .................. Passed 0.01 sec
Start 9: TutorialComp0.0001
9/9 Test #9: TutorialComp0.0001 ............... Passed 0.01 sec
 
100% tests passed, 0 tests failed out of 9
 
Total Test time (real) = 0.19 sec
Performing coverage
Cannot find any coverage files. Ignoring Coverage request.
Submit files (using http)
Using HTTP submit method
Drop site:http://
Error when uploading file: D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutoria
l/Step7/build/Testing/20100521-1833/Build.xml
Error message was: couldn't connect to host
Problems when submitting via HTTP
Errors while running CTest
產生了如下一些文件:
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM