• <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>

            吾嘗終日而思矣 不如須臾之所學(xué)也

            御物而行 御風(fēng)而飛
            隨筆 - 10, 文章 - 1, 評(píng)論 - 9, 引用 - 0
            數(shù)據(jù)加載中……

            Cmake的介紹和使用 Cmake實(shí)踐

            Cmake優(yōu)點(diǎn):

            1.       開(kāi)發(fā)源代碼,實(shí)用類BSD許可發(fā)布。

            2.       跨平臺(tái),并可以生成native編譯配置文件,在linux/unix平臺(tái),生成makefile,在mac平臺(tái)可以生成xcode,在windows平臺(tái)可以生成msvc工程的配置文件。

            3.       能夠管理大型項(xiàng)目

            4.       簡(jiǎn)化編譯構(gòu)建過(guò)程和編譯過(guò)程,只需要cmake+make就可以

            5.       高效率

            6.       可擴(kuò)展,可以為cmake編寫(xiě)特定功能的模塊,擴(kuò)充cmake功能

            如何安裝cmake

            1.       Cmake的安裝可以使用autotools進(jìn)行安裝,點(diǎn)擊cmake-2.8.6.tar.gz 鏈接,可以對(duì)軟件進(jìn)行下載。

            2.       ./configure

            3.       make

            4.       sudo make install

             

            Cmake的原理

             

            Helloworld cmake

            //main.cpp

            #include<cstdio>

             

            int main()

            {

                printf("hello world from main\n");

                return 0;

            }

             

            創(chuàng)建CMakeLists.txt(注意大小寫(xiě)一個(gè)字母都不能錯(cuò))

            向該文件中加入以下幾行(稍后會(huì)做解釋)

            PROJECT (HELLO)

            SET(SRC_LIST main.cpp)

            MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

            MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

            ADD_EXECUTABLE(hello ${SRC_LIST})

            運(yùn)行以下命令:

            cmake . (別忘記加上這個(gè)點(diǎn),表示當(dāng)前目錄)


            注意執(zhí)行完這句話之后會(huì)生成幾個(gè)文件如下:


            CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile

            然后執(zhí)行make 就可以生成可執(zhí)行文件hello


            這是當(dāng)前目錄下就會(huì)生成可執(zhí)行文件如下圖:


            對(duì)例子的解釋:

            CMakeLists.txt的內(nèi)容如下:

            PROJECT (HELLO)

            SET(SRC_LIST main.cpp)

            MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

            MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

            ADD_EXECUTABLE(hello ${SRC_LIST})

             

            Project的指令的語(yǔ)法是:

            PROJECT(projectname [CXX] [C] [JAVA])

            這個(gè)執(zhí)行是用來(lái)定義工程的名稱的和定義工程支持的語(yǔ)言。這個(gè)指令也隱式的定義了兩個(gè)cmake變量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,這里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,兩個(gè)變量指的都是當(dāng)前工程的路徑。

            SET指令的語(yǔ)法:

            SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])

            Set指令是用來(lái)顯式的定義變量的,我們之前用到的是SET(SRC_LIST main.cpp)如果有多個(gè)源文件,也可以定義成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。

             

            MESSAGE指令的語(yǔ)法是:

            MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

            這個(gè)指令用于向終端輸出用戶信息,包含三種類型:

            SEND_ERROR,產(chǎn)生錯(cuò)誤,生成過(guò)程被跳過(guò)。

            SATUS,輸出前綴為-的信息。

            FATAL_ERROR,立即終止所有cmake過(guò)程。

            我們?cè)谶@里使用的是STATUS信息輸出,顯示了由PROJECT指令頂一頂兩個(gè)飲食變量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

             

            ADD_EXECUTABLE(hello ${SRC_LIST})

            定義了這個(gè)工程會(huì)生成一個(gè)文件名為hello的可執(zhí)行文件,相關(guān)的源文件是SRC_LIST中定義的源文件列表,本例中你可以直接寫(xiě)成ADD_EXECUTABLE(hello main.c)。

             

            將本例改寫(xiě)成一個(gè)最簡(jiǎn)化的CMakeLists.txt:

            PROJECT(HELLO)

            ADD_EXECUTABLE(hello main.c)

             

            下面我們介紹一個(gè)比較實(shí)用的例子,即包含生成靜態(tài)庫(kù)又包含引入外部頭文件和鏈接庫(kù)的cmake demo。

            先按照工程規(guī)范建立工程目錄,并編寫(xiě)代碼,以下面的工程目錄為例進(jìn)行解釋這個(gè)例子,工程的目錄結(jié)構(gòu)為:

             

            編譯工程要實(shí)現(xiàn)的目標(biāo):

            1. 添加子目錄doc,用以放置這個(gè)工程的文檔hello.txt

            2. 生成hello的靜態(tài)庫(kù),并在main可執(zhí)行程序鏈接hello靜態(tài)庫(kù)

            3. 在這個(gè)工程中添加COPYRIGHT,README

            4. 在工程目錄中添加一個(gè)run.sh的腳本,用以調(diào)用生成的二進(jìn)制可執(zhí)行文件

            5. 將生成的二進(jìn)制文件生成到bin子目錄中

            6. 編寫(xiě)安裝程序

             

            1. 編寫(xiě)CMakeLists.txt

            由于一個(gè)工程目錄中包含多個(gè)項(xiàng)目,其中在此項(xiàng)目中包含util項(xiàng)目和main項(xiàng)目,其中util項(xiàng)目是用以生成main程序需要的靜態(tài)庫(kù),main是用以生成可執(zhí)行文件。

            在工程項(xiàng)目中的父目錄向有一個(gè)CMakeLists.txt是用以聲明定義工程需要的Cmake設(shè)置還定義了子目錄src,用以遞歸的調(diào)用src中的MakeLists.txt。其中工程目錄的CMakeLists.txt內(nèi)容定義如下:

            PROJECT(HELLO)

            ADD_SUBDIRECTORY(src)

            在src里面的CMakeLists.txt是用以定義src目錄包含的兩個(gè)工程的依賴關(guān)系分別進(jìn)行編譯。

            util目錄里面的CMakeLists.txt是用以定義生成util靜態(tài)庫(kù)的規(guī)則,其中內(nèi)容如下:

            SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)

            SET(CMAKE_C_COMPILER g++)

            SET(SRC_LIST hello.c)

             

            INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

            ADD_LIBRARY(util STATIC ${SRC_LIST})

            其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定義了庫(kù)生成的路徑,LIBRARY_OUTPUT_PATH是一個(gè)內(nèi)部變量,存放庫(kù)生成路徑。

            SET(SRC_LIST hello.c)是用來(lái)定義庫(kù)文件需要的源文件。

            INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用來(lái)定義非標(biāo)準(zhǔn)庫(kù)頭文件要搜索的路徑。其中INCLUDE_DIRECTORIES命令的格式為:

            INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

            ADD_LIBRARY(util STATIC ${SRC_LIST})是用來(lái)定義生成的庫(kù)的名字,以及生成庫(kù)的類型和生成庫(kù)需要的源文件,其中ADD_LIBRARY命令格式為:

                 ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]

                      [EXCLUDE_FROM_ALL]

                            source1 source2 ... sourceN)

            SET(CMAKE_C_COMPILER g++)是用來(lái)定義c的編譯器為g++,防止出現(xiàn)C和C++代碼在不指定C編譯器的情況下默認(rèn)使用gcc,導(dǎo)致系統(tǒng)編譯混亂。

            在main目錄中的CMakeLists.txt是用來(lái)定義可執(zhí)行程序編譯和鏈接時(shí)所需要的一些命令或環(huán)境。內(nèi)容如下:

            SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)

            SET(SRC_LIST main.cpp)

             

            INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

            LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)

             

            ADD_EXECUTABLE(hello ${SRC_LIST})

            TARGET_LINK_LIBRARIES(hello util)

            INCLUDE_DIRECTORIES命令是定義工程的include文件夾,其中存放使用到的庫(kù)的頭文件,LINK_DIRECTORIES是定義工程的庫(kù)文件,其中存放著庫(kù)文件,ADD_EXECUTABLE是定義生成的可執(zhí)行文件,TARGET_LINK_LIBRARIES用以定義鏈接時(shí)需要的庫(kù)文件。

            2.在工程目錄下創(chuàng)建build目錄,并采用out-of-source方式編譯項(xiàng)目。執(zhí)行命令make ..,執(zhí)行結(jié)果如下:


            執(zhí)行make,這時(shí)在build目錄下生成了中間編譯文件:


            執(zhí)行make命令,結(jié)果如下:


            可以看到工程創(chuàng)建和編譯成功了。

            2. 安裝

            在工程目錄下添加COPYRIGHT、README、和run.sh,重新編輯工程目錄下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:

            INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)

            INSTALL(PROGRAMS run.sh DESTINATION bin)

            INSTALL(PROGRAMS bin/hello DESTINATION bin)

            INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)

            這些命令表示在執(zhí)行make install命令時(shí),安裝程序會(huì)拷貝相應(yīng)的文件、目錄或程序到指定的前綴開(kāi)始的目錄中,cmake執(zhí)行命令如下:

            cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..這時(shí)將工程目錄安裝到~/data/cmake_demo目錄下。執(zhí)行結(jié)果如下:


            其中cmake編譯c、c++工程完畢。

            posted on 2011-11-17 20:18 Roger 閱讀(72045) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: Cmake的介紹和使用 Cmake實(shí)踐  回復(fù)  更多評(píng)論   

            請(qǐng)問(wèn)如何添加COPYRIGHT、README、和run.sh,是添加三個(gè)空文件么?還是說(shuō)run.sh是需要內(nèi)容的?
            2014-04-04 17:20 | smellflower

            # re: Cmake的介紹和使用 Cmake實(shí)踐  回復(fù)  更多評(píng)論   

            感謝分享
            2015-07-22 22:17 | cx

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            国产精品久久久久a影院| 国内精品久久久久久野外| 婷婷久久综合九色综合98| 无码人妻精品一区二区三区久久久 | 久久综合综合久久狠狠狠97色88| 国产色综合久久无码有码| 亚洲欧洲精品成人久久奇米网 | 色综合久久综精品| 亚洲国产精品一区二区久久| 99国产欧美久久久精品蜜芽| 国产午夜久久影院| 国内精品久久久久久久久电影网| 国产成人精品久久亚洲高清不卡| 久久99精品久久久久久不卡 | 久久九九久精品国产免费直播| 亚洲精品美女久久久久99小说| 久久精品二区| 久久妇女高潮几次MBA| 无码日韩人妻精品久久蜜桃| 久久综合香蕉国产蜜臀AV| 久久精品国产亚洲av影院| 999久久久国产精品| 久久久久久久亚洲精品| 热99RE久久精品这里都是精品免费| 国产成人无码精品久久久性色| 国内精品久久久久影院一蜜桃| 久久青青草原综合伊人| 一本色道久久88综合日韩精品 | 久久精品国产亚洲沈樵| 久久久99精品成人片中文字幕| 77777亚洲午夜久久多人| 国产精品久久久久久福利69堂| 久久99精品国产麻豆婷婷| 久久精品国产亚洲AV久| 国产亚洲婷婷香蕉久久精品| 色综合久久中文字幕综合网| 久久精品无码一区二区无码 | 亚洲午夜久久久| 久久这里只有精品首页| 久久精品国产色蜜蜜麻豆| 97久久精品人人做人人爽|