<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    CMake入門指南

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 原文地址:http://www.cnblogs.com/sinojelly/archive/2010/05/22/1741337.html 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。 下載地址:http://www.cmake.org/cmake/resources/software.html 根據自己的需要下載相應的包即可,Windows下可以下載zip壓縮的綠色版本,還可以下載源代碼。 RFID設備管理軟件 (2)運行cmake的方法。(GUI、命令行) http://www.cmake.org/cmake/help/runningcmake.html
    CMake使用步驟:
    運行GUI的cmake界面:
    cmake-2.8.1-win32-x86\bin\cmake-gui.exe RFID設備管理軟件
    執行Configure:
    運行之后,生成了如下文件:
    RFID設備管理軟件
    生成Makefile:
    執行Generate之后生成如下文件:
    RFID設備管理軟件 運行make進行編譯:
    RFID設備管理軟件 編譯完成后,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果:
    RFID設備管理軟件 運行make install安裝程序:
    RFID設備管理軟件 運行make test進行測試: RFID設備管理軟件   通過cmake tutorial學習CMake配置方法
    http://www.cmake.org/cmake/help/cmake_tutorial.html 可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。 RFID設備管理軟件 1、Step1。 (如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面“CMake使用步驟”的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。)
    簡單的程序編譯。 (1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。 RFID設備管理軟件 (2)點擊Configure,配置成功后,再點擊Generate。 配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。
    RFID設備管理軟件 (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安裝包文件:
    RFID設備管理軟件 安裝完成后,還可以很方便的卸載它:
    RFID設備管理軟件 運行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
    RFID設備管理軟件 dashboard上顯示的項目名稱通過如下方式設置:
    RFID設備管理軟件 需要先把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 產生了如下一些文件:
    RFID設備管理軟件RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全