• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            CMake使用

            cmake學(xué)習(xí)(一)靜態(tài)庫與動態(tài)庫構(gòu)建

            (.so)共享庫,shared object:節(jié)省空間,在運行時去連接,如果執(zhí)行機器上沒有這些庫文件就不能執(zhí)行。
            (.a)靜態(tài)庫,archive:靜態(tài)庫和程序化為一體,不會分開。
            通過 ldd命令可以查看一個可執(zhí)行程序所依賴的的共享庫。
            使用環(huán)境變量LD_LIBRARY_DIRECTORY可以指定共享庫位置


            一、編譯共享庫:
            ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})

            二、添加靜態(tài)庫:
            ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})
            因為默認(rèn)規(guī)則是不能有相同名字的共享庫與靜態(tài)庫,所以當(dāng)生成靜態(tài)庫的時候(so后綴),共享庫會被刪除,因為只能允許一個名字存在,相同名字的會被替代(hello),所以需要通過SET_TARGET_PROPERTIES()來解決這個問題,例子:
            SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
            cmake在構(gòu)建一個target的時候,會刪除之前生成的target,一樣是通過設(shè)置SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)來達到目的
            三、動態(tài)庫的版本號:
            同樣是通過SET_TARGET_PROPERTIES()來設(shè)置
            SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
            VERSION:動態(tài)庫版本
            SOVERSION:API版本
            最后生成的結(jié)果是:
            libhello.so.1.2
            libhello.so.1->libhello.so.1.2
            libhello.so->libhello.so.1
            四、安裝:
            INSTALL(TARGETS hello hello_static
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib)
            INSTALL(TARGETS hello.h
            DESTINATION include/hello)
            其他常用的屬性 PERMISSIONS:設(shè)置權(quán)限;RATTERN:設(shè)置正則表達式


            Summary:
            ADD_LIBRARY():添加一個庫,共享庫,靜態(tài)庫,模塊
            SET_TARGET_PROPERTIES():設(shè)置輸出名稱,版本號,解決相同target被刪除的問題
            GET_TARGET_PROEERTIES():與SET功能相對

            cmake學(xué)習(xí)(二)常用變量和常用環(huán)境變量
            一、變量的引用方式是使用“${}”,在IF中,不需要使用這種方式,直接使用變量名即可
            二、自定義變量使用SET(OBJ_NAME xxxx),使用時${OBJ_NAME}
            三、cmake的常用變量:
            CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR:
            這三個變量內(nèi)容一致,如果是內(nèi)部編譯,就指的是工程的頂級目錄,如果是外部編譯,指的就是工程編譯發(fā)生的目錄。
            CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR:
            這三個變量內(nèi)容一致,都指的是工程的頂級目錄。
            CMAKE_CURRENT_BINARY_DIR:外部編譯時,指的是target目錄,內(nèi)部編譯時,指的是頂級目錄
            CMAKE_CURRENT_SOURCE_DIR:CMakeList.txt所在的目錄
            CMAKE_CURRENT_LIST_DIR:CMakeList.txt的完整路徑
            CMAKE_CURRENT_LIST_LINE:當(dāng)前所在的行
            CMAKE_MODULE_PATH:如果工程復(fù)雜,可能需要編寫一些cmake模塊,這里通過SET指定這個變量
            LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR:庫和可執(zhí)行的最終存放目錄
            PROJECT_NAME:你猜~~

             

            四、cmake中調(diào)用環(huán)境變量
            1.Using $ENV{NAME} : invoke system environment varible.
            We can use "SET(ENV{NAME} value)" as well. note that the "ENV" without "$".
            2.CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})


            五、其他的內(nèi)置變量
            1.BUILD_SHARED_LIBS:set the default value when using ADD_LIBRARY()
            2.CMAKE_C_FLAGS: set compiler for c language
            2.CMAKE_CXX_FLAGS: set compiler for c++ language


            六、區(qū)分debug和release
            在工程目錄下,cmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE),再執(zhí)行make


            七、指定編譯32bit或64bit程序
            SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
            SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

            cmake學(xué)習(xí)(三)常用指令

            一、基本指令:
            INCLUDE_DIRECTORIES(${includedir}) #-I。
            LINK_DIRECTORIES(${libdir}) #-L
            TARGET_LINK_LIBRARIES(helloworld ${linkflags}) #-l
            ADD_DEFINITIONS(${cflags}) #-D
             
            1、ADD_DEFINATIONS:向C/CPP添加宏定義,相當(dāng)于gcc中的-D,參數(shù)之間用空格分割
            2、ADD_DEPENDICIES(target_name, depend_name):定義target對其他target的依賴關(guān)系
            3、AUX_SOURCE_DIRECTORY(dir VARIBLE):把目錄下的所有源文件保存在變量中,基本用來創(chuàng)建源文件列表
            4、ADD_EXECUTABLE:指定目錄,生成執(zhí)行文件
            5、EXEC_PROGRAM:外部調(diào)用指令,可移執(zhí)行任何外部命令,后面加參數(shù),例子如下:
            EXEC_PROGERAM(ls ARGS"*.c" OUTPUT_VARIBLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
            IF(not LS_RVALUE)
            MESSAGE(STATUS "xxx")
            ENDIF(not LS_RVAULE)
            PS.這里執(zhí)行l(wèi)s *.c指令,執(zhí)行成功的話,返回0。
            6、FILE指令:
            FILE(WRITE file_name "content")
            FILE(APPEND file_name "content")
            FILE(READ file_name varible)
            FILE(WRITE file_name "content")
            7、FIND_系列指令:
            LIBRARY( name path):
            FIND_LIBRARY(Xorg X11 /usr/lib64)
            IF(not Xorg)
            MESSAGE(STATUS "no Xorg")
            ENDIF(not Xorg)
            FILE( name path)
            PATH( name path)
            PROGRAM( name path)
            PACKAGE( [major.minor][QUIET][NO MODULE][[REQUIRED][COMPONTS][componts....]])
            最后一條,用來調(diào)用放在CMAKE_MODULE_PATH下的Find.cmake模塊,也可以自定義Find模塊
            首先通過SET(CMAKE_MODULE_PATH /home/...)來指定位置

            8、控制指令:
            IF(expression),ELSE(expression),ENDIF(expression)
            express舉例:
            否定:空,0,N,NO,OFF,F(xiàn)ALSE,NOTFOUND或_NOTFOUND
            肯定:COMMAND cmd,EXISTS dir/file,variable MARCHES regex等等等等還有很多~~~隨用隨查吧


            cmake學(xué)習(xí)(四)模塊的使用和自定義模塊

            FIND_PACKAGE
            每一個模塊都會產(chǎn)生如下變量
            _FOUND
            _INCLUDE_DIR
            _LIBRARY or _LIBRARIES
            如果_FOUND為真,把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中。

            編寫屬于自己的FindHello模塊:
            1.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
            2.FIND_LIBRARY(HELLO_LIBRARY_DIR NAMES hello PATH /usr/lib /usr/local/lib)
              IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
              SET(HELLO_FOUND TRUE)
              ENDIF(HELLO_INCLUDE_DIR)
            3.FIND_PACKAGE([major.minor][QUIET][NO_MODULE]
            [[REQUIRED|COMPONENTS][componets...]])
            QUIET參數(shù):去掉輸出信息
            REQUIRED參數(shù):共享庫是否是工程必須的,如果是必須的,那么找不到
            如果在src中想調(diào)用hello模塊中的內(nèi)容
            FIND_PACKAGE(HELLO)
            為了可以讓工程找到FindHELLO.cmake
            在主工程的CMakeList.txt中,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_PATH}/cmake)
            通過設(shè)置FIND_PACKAGE(HELLO QUIET)可以去掉輸出信息

            Cmake CMAKE_BUILD_TYPE specification

            That’s because no build type has been specified to CMake. The build type is a feature most IDE have, it allows you to compile your program in “debug” mode, for easily single-stepping through it with a debugger, or in “release” mode, with speed optimization enabled.

            To fix this you simply need to specify a build type in the CMakeLists.txt file, in this way:


            if( NOT CMAKE_BUILD_TYPE )
              set( CMAKE_BUILD_TYPE Debug CACHE STRING
                   "Choose the type of build, options are: None Debug Release RelWithDebInfo
            MinSizeRel."
                   FORCE )
            endif()
            
            
            when cmake is run without specifying the build type using -D CMAKE_BUILD_TYPE, it is the Debug mode that is selected as the default.


             

            posted on 2016-09-11 22:52 Daywei 閱讀(1272) 評論(0)  編輯 收藏 引用 所屬分類: Linux

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            牛人博客

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国产日产久久高清欧美一区| 尹人香蕉久久99天天拍| 久久综合九色综合网站| 成人综合伊人五月婷久久| 久久精品国产亚洲AV电影| 久久不射电影网| 久久99精品久久久久久野外| 怡红院日本一道日本久久| 99久久国产免费福利| 亚洲精品tv久久久久久久久久| 狠狠色婷婷久久综合频道日韩 | 性高湖久久久久久久久AAAAA| 久久无码人妻精品一区二区三区| 久久狠狠爱亚洲综合影院| 丰满少妇高潮惨叫久久久| 天天影视色香欲综合久久| 精品久久8x国产免费观看| 久久久久国产视频电影| 久久精品国产亚洲av麻豆小说 | 久久精品国产2020| 国产叼嘿久久精品久久| 亚洲精品无码久久久久sm| 99久久精品国产一区二区三区| 久久精品中文无码资源站| 91精品久久久久久无码| 精品久久久久久亚洲精品| 午夜精品久久久久久影视riav| 一本大道加勒比久久综合| 久久亚洲精品人成综合网| 久久国产免费直播| 久久久亚洲欧洲日产国码是AV| 久久九九久精品国产免费直播| 青青青青久久精品国产| 韩国免费A级毛片久久| 丰满少妇高潮惨叫久久久| 久久国产精品成人片免费| 久久99精品国产麻豆| 日本欧美久久久久免费播放网 | 久久精品夜色噜噜亚洲A∨| 狠狠色丁香婷婷综合久久来 | 久久久精品人妻一区二区三区蜜桃|