天天看點

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也是用它編譯的,感興趣的可以試用一下。

準備活動:

(1)安裝cmake。

根據自己的需要下載下傳相應的包即可,Windows下可以下載下傳zip壓縮的綠色版本,還可以下載下傳源代碼。

(2)運作cmake的方法。(GUI、指令行)

<a href="http://www.cmake.org/cmake/help/runningcmake.html">http://www.cmake.org/cmake/help/runningcmake.html</a>

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配置方法

<a href="http://www.cmake.org/cmake/help/cmake_tutorial.html">http://www.cmake.org/cmake/help/cmake_tutorial.html</a>

可以在源代碼的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&gt;make

Linking CXX executable Tutorial.exe

[100%] Built target Tutorial

可以運作一下Turorial.exe:

D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3&gt;Tutorial.exe

Tutorial.exe Version 1.0

Usage: Tutorial.exe number

D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3&gt;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&gt;make

[ 50%] Building CXX object MathFunctions/CMakeFiles/MathFunctions.dir/mysqrt.cxx

.obj

Linking CXX static library libMathFunctions.a

[ 50%] Built target MathFunctions

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&gt;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&gt;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&gt;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即可看到結果。

2/5 Test #2: TutorialComp25 ...................***Failed Required regular expre

ssion not found.Regex=[25 is 3

] 0.01 sec

4/5 Test #4: TutorialSmall .................... Passed 0.01 sec

5/5 Test #5: TutorialUsage .................... Passed 0.01 sec

80% tests passed, 1 tests failed out of 5

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) &amp;&amp; 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&gt;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&gt;make

First 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&gt;make package

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之後,運作成功:

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&gt;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:

<a href="http://www.cdash.org/CDash/index.php?project=PublicDashboard">http://www.cdash.org/CDash/index.php?project=PublicDashboard</a>

dashboard上顯示的項目名稱通過如下方式設定:

需要先把cmake/bin目錄加入path中,然後執行ctest -D Experimental。這裡遇到了一個錯誤。

D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build&gt;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.

0 Compiler errors

0 Compiler warnings

Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build

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

産生了如下一些檔案:

沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的架構所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如别人所關心你的。理想的騰飛與實作,沒有别人的支援與幫助,是萬萬不能的。

   本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/arxive/p/6215106.html,如需轉載請自行聯系原作者

繼續閱讀