<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系統、金蝶與條碼系統對接、用友與條碼系統對接

    無論生活還是工作上,做過的事,需要總結下。

    接觸cmake,一般都會看一本書 <<cmake 實踐>>. 這是cmake的入門書。我就不多說了。

    下面說一下我對部分cmake命令的使用與理解,不正確的,請大家指點,謝謝!

    1. 所有的注釋,都以#開頭。
    #XXX Build Script
    #CMakeLists.txt
    #
    #Copyright (c) 2011, L
    #All rights reserved.

    2. cmake版本的控制。
    cmake_minimum_required (VERSION 2.8)

    3. 定義項目名稱。
    PROJECT (xxx)

    4. 如果想看到更多cmake編譯時候的信息,置為ON,否則為OFF.
    set(CMAKE_VERBOSE_MAKEFILE ON)

    5. 在項目中,我們一般會用到一些第三方庫。cmake支持一些,注意,只是部分。例如對Boost的支持,對apr的不支持。
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREAD ON)
    find_package(Boost 1.4.3 REQUIRED)
    如果你的機器上裝有Boost,它會自動找出來,找不出來,就會報錯,停止編譯。(REQUIRED的作用)

    在項目中,我們用到了apache runtime library(apr).cmake不支持,我的解決方法手動添加apr的路徑。
    例如:
    #apr
    SET(APR_ROOT $ENV{APR_DIST})
    嘗試寫個.cmkae模塊,用findXXX調用,但是不知道該如何如找apr的安裝路徑。有知道的朋友,希望指點,謝謝!
    找到Boost后,我們會自動得到它的include路徑和lib路徑。
    同時,我們可以得到一些庫的名稱。
    MESSAGE(STATUS "Boost include path:" ${Boost_INCLUDE_DIRS})
    MESSAGE(STATUS "Boost lib path:" ${Boost_LIBRARY_DIRS})

    FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
    STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY ${Boost_SYSTEM_LIBRARY})
    STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY_DEBUG ${Boost_SYSTEM_LIBRARY_DEBUG})
    STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY_RELEASE ${Boost_SYSTEM_LIBRARY_RELEASE})

    6. 如果你的cmake實現中,用到了一些模塊,例如*.cmake.這個時候,需要
    #set module path. for FindXXX.cmake
    SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})

    7. 創建宏。
    例如你建的工程是unicode 編碼,可以這樣:
    #set character set. unicode
    add_definitions(-DUNICODE -D_UNICODE)

    8.  添加子目錄,它會去子目錄中尋找CmakeLists.txt,然后執行它。
    ADD_SUBDIRECTORY(subdir)

    9. 將一個文件下的編譯用的源文件添加到一個宏列表中。
    AUX_SOURCE_DIRECTORY(. SRC_LIST)
    注意,它只是將.cc .cpp .c的文件添加到SRC_LIST中,.h除外。

    10. 如果你想將.h文件也加進來,使用
    file (GLOB HEADERS "include/*.h")
    SET(SRC_LIST ${SRC_LIST} ${HEADERS})

    注意GLOB這個參數,它不支持子目錄。如果你想讓它支持子目錄,用GLOB_RECURSE。
    在vs中可以創建子文件夾,這樣會使我們的項目看上去美觀,規范。
    cmake支持這一功能。
    source_group(Include\\utils FILES ${HEADERS})
    這個可以親自試試,看看效果。在使用這個命令的時候,本想用regex,正則來處理,試過了好幾次,發現cmake好像不怎么支持正則,例如Perl的語法。
    例如:if(${f} MATCHES "(.*)(\.h)$")
    如在這塊有心得的朋友,希望指點下,哈哈。

    11. 頭文件包含路徑及庫路徑
    INCLUDE_DIRECTORIES
    link_directories

    12. 在windows+vs中,如果我們想改變項目的輸出路徑,dll, .lib,需要
    IF(MSVC)
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/lib )
    ELSE(MSVC)
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib )
    ENDIF(MSVC)

    13. 檢查一個文件或目錄是否存在,用
    if(NOT EXISTS ${APR_ROOT})
    endif()
    注意這里的if,是小寫的,用大寫的,就會報錯,為此,我折騰了半天。

    14. cmake提供了gui界面。如果想使用界面方式,例如:設置變量MY_ROOT的值
    SET(MY_ROOT "/usr/lib" CACHE PATH "my root path")
    記得不要加FORCE。加上了,會rebuild,不是我們想要的效果。

    好了,希望對用得到的朋友,有所幫助。謝謝!

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全