青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 10, 文章 - 1, 評論 - 9, 引用 - 0
數據加載中……

Cmake的介紹和使用 Cmake實踐

Cmake優點:

1.       開發源代碼,實用類BSD許可發布。

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

3.       能夠管理大型項目

4.       簡化編譯構建過程和編譯過程,只需要cmake+make就可以

5.       高效率

6.       可擴展,可以為cmake編寫特定功能的模塊,擴充cmake功能

如何安裝cmake

1.       Cmake的安裝可以使用autotools進行安裝,點擊cmake-2.8.6.tar.gz 鏈接,可以對軟件進行下載。

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;

}

 

創建CMakeLists.txt(注意大小寫一個字母都不能錯)

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

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})

運行以下命令:

cmake . (別忘記加上這個點,表示當前目錄)


注意執行完這句話之后會生成幾個文件如下:


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

然后執行make 就可以生成可執行文件hello


這是當前目錄下就會生成可執行文件如下圖:


對例子的解釋:

CMakeLists.txt的內容如下:

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的指令的語法是:

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

這個執行是用來定義工程的名稱的和定義工程支持的語言。這個指令也隱式的定義了兩個cmake變量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,這里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,兩個變量指的都是當前工程的路徑。

SET指令的語法:

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

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

 

MESSAGE指令的語法是:

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

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

SEND_ERROR,產生錯誤,生成過程被跳過。

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

FATAL_ERROR,立即終止所有cmake過程。

我們在這里使用的是STATUS信息輸出,顯示了由PROJECT指令頂一頂兩個飲食變量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

 

ADD_EXECUTABLE(hello ${SRC_LIST})

定義了這個工程會生成一個文件名為hello的可執行文件,相關的源文件是SRC_LIST中定義的源文件列表,本例中你可以直接寫成ADD_EXECUTABLE(hello main.c)。

 

將本例改寫成一個最簡化的CMakeLists.txt:

PROJECT(HELLO)

ADD_EXECUTABLE(hello main.c)

 

下面我們介紹一個比較實用的例子,即包含生成靜態庫又包含引入外部頭文件和鏈接庫的cmake demo。

先按照工程規范建立工程目錄,并編寫代碼,以下面的工程目錄為例進行解釋這個例子,工程的目錄結構為:

 

編譯工程要實現的目標:

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

2. 生成hello的靜態庫,并在main可執行程序鏈接hello靜態庫

3. 在這個工程中添加COPYRIGHT,README

4. 在工程目錄中添加一個run.sh的腳本,用以調用生成的二進制可執行文件

5. 將生成的二進制文件生成到bin子目錄中

6. 編寫安裝程序

 

1. 編寫CMakeLists.txt

由于一個工程目錄中包含多個項目,其中在此項目中包含util項目和main項目,其中util項目是用以生成main程序需要的靜態庫,main是用以生成可執行文件。

在工程項目中的父目錄向有一個CMakeLists.txt是用以聲明定義工程需要的Cmake設置還定義了子目錄src,用以遞歸的調用src中的MakeLists.txt。其中工程目錄的CMakeLists.txt內容定義如下:

PROJECT(HELLO)

ADD_SUBDIRECTORY(src)

在src里面的CMakeLists.txt是用以定義src目錄包含的兩個工程的依賴關系分別進行編譯。

util目錄里面的CMakeLists.txt是用以定義生成util靜態庫的規則,其中內容如下:

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)定義了庫生成的路徑,LIBRARY_OUTPUT_PATH是一個內部變量,存放庫生成路徑。

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

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用來定義非標準庫頭文件要搜索的路徑。其中INCLUDE_DIRECTORIES命令的格式為:

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

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

     ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]

          [EXCLUDE_FROM_ALL]

                source1 source2 ... sourceN)

SET(CMAKE_C_COMPILER g++)是用來定義c的編譯器為g++,防止出現C和C++代碼在不指定C編譯器的情況下默認使用gcc,導致系統編譯混亂。

在main目錄中的CMakeLists.txt是用來定義可執行程序編譯和鏈接時所需要的一些命令或環境。內容如下:

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文件夾,其中存放使用到的庫的頭文件,LINK_DIRECTORIES是定義工程的庫文件,其中存放著庫文件,ADD_EXECUTABLE是定義生成的可執行文件,TARGET_LINK_LIBRARIES用以定義鏈接時需要的庫文件。

2.在工程目錄下創建build目錄,并采用out-of-source方式編譯項目。執行命令make ..,執行結果如下:


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


執行make命令,結果如下:


可以看到工程創建和編譯成功了。

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)

這些命令表示在執行make install命令時,安裝程序會拷貝相應的文件、目錄或程序到指定的前綴開始的目錄中,cmake執行命令如下:

cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..這時將工程目錄安裝到~/data/cmake_demo目錄下。執行結果如下:


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

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

評論

# re: Cmake的介紹和使用 Cmake實踐  回復  更多評論   

請問如何添加COPYRIGHT、README、和run.sh,是添加三個空文件么?還是說run.sh是需要內容的?
2014-04-04 17:20 | smellflower

# re: Cmake的介紹和使用 Cmake實踐  回復  更多評論   

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久亚洲电影| 亚洲已满18点击进入久久| 欧美中在线观看| 亚洲欧美激情精品一区二区| 一本久道久久综合婷婷鲸鱼| 亚洲作爱视频| 亚洲精品在线免费| 亚洲日本久久| 亚洲国产精品va在线观看黑人| 国产精品白丝黑袜喷水久久久 | 蜜桃av一区二区| 欧美一区二区三区男人的天堂| 久久久久久久久久看片| 久久国产精彩视频| 久久久久久九九九九| 欧美国产视频一区二区| 一本色道婷婷久久欧美| 欧美一区国产二区| 欧美顶级大胆免费视频| 国产精品大片| 狠狠久久综合婷婷不卡| 亚洲乱码国产乱码精品精可以看 | 欧美专区在线观看| 另类酷文…触手系列精品集v1小说| 亚洲美女尤物影院| 亚洲一区二区三区视频播放| 久久精品99久久香蕉国产色戒| 亚洲日本一区二区三区| 亚洲综合视频网| 欧美高清在线播放| 国产在线视频欧美| 亚洲视频国产视频| 欧美成人免费在线| 亚洲欧美在线免费| 欧美日韩国产在线一区| 黄色精品一区| 亚洲一级二级| 亚洲高清久久久| 久久精品123| 国产精品欧美日韩| 在线亚洲欧美视频| 欧美电影美腿模特1979在线看| 可以看av的网站久久看| 99视频有精品| 欧美二区视频| 影音欧美亚洲| 久久久久亚洲综合| 亚洲欧美春色| 国产精品日韩在线播放| 亚洲另类春色国产| 欧美夫妇交换俱乐部在线观看| 欧美三级韩国三级日本三斤| 午夜视频在线观看一区| 欧美成年人视频| 娇妻被交换粗又大又硬视频欧美| 国产一区激情| 欧美伊人久久大香线蕉综合69| 午夜免费电影一区在线观看| 亚洲人成网站在线播| 久久九九全国免费精品观看| 国产欧美日韩精品丝袜高跟鞋 | 久久久久一本一区二区青青蜜月| 久久se精品一区精品二区| 亚洲精品五月天| 欧美激情一区二区三区高清视频| 欧美三级网页| 亚洲人成在线免费观看| 欧美黄色精品| 欧美福利小视频| 99精品国产在热久久婷婷| 91久久综合| 国产精品国产亚洲精品看不卡15| 国产麻豆精品视频| 亚洲综合欧美| 欧美一级二区| 亚洲成在人线av| 亚洲欧洲一区二区天堂久久 | 欧美99在线视频观看| 久久久在线视频| 亚洲国产高清一区| 亚洲欧洲美洲综合色网| 欧美日韩在线免费视频| 午夜精品亚洲一区二区三区嫩草| 欧美国产大片| 欧美日韩国产丝袜另类| 亚洲免费在线| 久久久在线视频| 亚洲视频电影图片偷拍一区| 午夜精品一区二区三区四区 | 在线视频欧美精品| 夜夜嗨av一区二区三区| 国产精品午夜视频| 久久综合九色欧美综合狠狠| 欧美成人高清| 久久成人一区| 欧美欧美在线| 久久精品视频播放| 欧美精品一区二区三区视频| 午夜久久久久久久久久一区二区| 日韩午夜激情av| 国产精品理论片| 免费在线看成人av| 国产精品久久久久久久久免费| 亚洲作爱视频| 每日更新成人在线视频| 亚洲国产精品久久久久婷婷老年 | 国内精品伊人久久久久av一坑| 亚洲精品久久| 亚洲视频在线观看三级| 亚洲国产精品一区二区尤物区| 久久黄色级2电影| 欧美成人免费一级人片100| 午夜在线不卡| 欧美日韩18| 欧美激情自拍| 精品福利免费观看| 亚洲欧美日韩精品久久亚洲区 | 久久精品视频在线看| 亚洲乱码国产乱码精品精可以看| 美女黄色成人网| 国产精品美女视频网站| 亚洲国产精品www| 亚洲夫妻自拍| 久久女同互慰一区二区三区| 欧美一区二区高清在线观看| 欧美日韩国产小视频| 亚洲欧洲视频| 亚洲国内自拍| 久久中文在线| 女人香蕉久久**毛片精品| 国外视频精品毛片| 欧美在线亚洲综合一区| 久久久久中文| 海角社区69精品视频| 欧美一级大片在线观看| 久久久91精品国产一区二区三区| 久久九九有精品国产23| 久久av资源网站| 国产午夜精品视频免费不卡69堂| 久久久蜜桃精品| 国产精品剧情在线亚洲| 亚洲在线一区二区| 欧美一级网站| 国产一区二区三区久久久| 欧美在线关看| 另类国产ts人妖高潮视频| 一区二区三区在线视频播放| 久久久久**毛片大全| 欧美大香线蕉线伊人久久国产精品| 欧美日韩一区二区三区在线看| 亚洲欧美怡红院| 欧美视频一区二区三区| 亚洲一区999| 久久激情五月婷婷| 狠狠色香婷婷久久亚洲精品| 久久久久五月天| 欧美韩国一区| 亚洲一区二区动漫| 国产一区二区三区日韩| 久久综合中文字幕| 亚洲久久一区| 久久福利毛片| 亚洲日本va午夜在线影院| 欧美日韩另类在线| 亚洲日本va在线观看| 欧美日韩三区四区| 午夜久久影院| 欧美激情一区| 亚洲一区影音先锋| 国内免费精品永久在线视频| 女女同性女同一区二区三区91| 欧美一区二区在线免费观看| 国产精品久久国产精麻豆99网站| 亚洲国产欧美日韩精品| 中国成人在线视频| 国产一区二区三区黄| 久热精品视频在线免费观看| 亚洲毛片播放| 久久伊人精品天天| 中日韩美女免费视频网站在线观看| 免播放器亚洲一区| 亚洲精品一区二区三区婷婷月| 亚洲福利一区| 国产精品黄视频| 裸体歌舞表演一区二区| 一区二区日韩精品| 欧美高清在线精品一区| 香蕉久久国产| 一本色道久久88精品综合| 韩国v欧美v日本v亚洲v| 国产精品久久久久秋霞鲁丝| 久久综合九色欧美综合狠狠| 亚洲网站在线观看| 亚洲国产精品va在线看黑人动漫| 亚洲欧洲日产国产综合网| 国产精品成人播放| 欧美丰满少妇xxxbbb| 久久久久国产一区二区三区| 亚洲男同1069视频| 正在播放欧美视频|