程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> CMake安裝使用教程

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。

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

      
           CMake使用步驟:

      運行GUI的cmake界面:

      cmake-2.8.1-win32-x86bincmake-gui.exe

    CMake安裝使用教程 三聯

      執行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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep1build3>makeLinking CXX executable Tutorial.exe

      [100%] Built target Tutorial

      可以運行一下Turorial.exe:

      D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep1build3>Tutorial.exe

      Tutorial.exe Version 1.0

      Usage: Tutorial.exe number

      D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep1build3>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:ToolsCMDUnxUtilsusrlocalwbinmake.exe

      編譯過程:

      D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep2build>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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep3build>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 FilesTutorial>tree /f

      C:.

      ├─bin

      │ libMathFunctions.a

      │ Tutorial.exe

      │

      └─include

      MathFunctions.h

      TutorialConfig.h

      執行make test:

      D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep3build>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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep3build>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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep5build>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:UsersDesktop>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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep6build>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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep6build>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:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep6build>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上顯示的項目名稱通過如下方式設置:

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

      D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep7build>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

      產生了如下一些文件:

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved