亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用cmake自動構建工程

2019-11-14 08:58:16
字體:
來源:轉載
供稿:網友

      公司引擎是用cmake根據目標平臺來構建工程的,剛接觸的時候深深體會到cmake的方便:如果目標平臺是windows,它可以幫你自動構建出vs工程;如果是安卓,自動構建出eclipse工程,如果是IOS,自動構建出xcode工程。想想以前用vs建工程的時候,如果要引入第三方庫,必須要手動配置第三方庫路徑,如果引入的庫少,那還沒什么,如果多的話就悲劇了,配個環境都要半天。再想想以前在linux平臺下手動寫Makefile的時候,如果工程比較小,模塊少還好辦,如果工程大,模塊多,各種寫依賴關系都要讓你抓狂。有了cmake這個工具,我們完全可以靠它來幫我們構建vs工程,寫Makefile文件。既然cmake構建工程這么方便,當然需要拿來用,可是對于我這個小白來說,怎么學呢?果斷谷歌,百度,不過并沒有找到比較有價值的學習資料,很多人都是貼出了cmake的源文件CMakeLists.txt,然后對文件中的每行都講了下作用??赐赀@些,我依然不知道為什么要這么寫,為什么這行要這樣寫,那行要那樣寫?后來才反應過來,cmake官網肯定有講啊,雖然是英文的,雖然自己英文比較挫,沒辦法,誰叫沒有其它資料呢(其實官網講的才說最權威的,不要因為是英文就畏懼,看多了其實英文也沒那么難,很多人自認為英文不行或者看英文吃力就去網上找各種中文資料,結果可能花費了大量時間在找資料上,到最后啥都沒學到)。本文主要通過講解cmake中一些比較簡單的命令來構建自己的工程,作為初學者的入門。

 

1、兩行命令幫你構建輸出hello world的vs工程

      為了自動構建工程,需要在源文件所在的最上層目錄寫一個CMakeLists.txt文件,它是cmake的源文件,也可以看作是cmake的腳本文件,這個文件描述了cmake怎樣幫我們自動構建工程。現在我們有一個hello.cpp文件,需要用這個文件來構建一個vs工程,手動的方法就是打開vs,新建一個工程hello,然后把hello.cpp添加到hello工程里面。而有了cmake,只需要在CMakeLists.txt寫兩行命令,第一行給自己工程命個名hello,第二行hello工程需要的源文件hello.cpp。然后通過下面幾個步驟,就可以生成一個vs工程了,生成其它工程的步驟相同,只是在選擇目標工程的時候不同。

1.1 編寫CMakeLists.txt文件和hello.cpp文件

CMakeLists.txt

PRoject(hello)add_executable(hello hello.cpp)

hello.cpp

復制代碼
#include <stdio.h>int main (int argc, char *argv[]){    printf("hello world!");    return 0;}復制代碼

 

1.2 設置路徑

 

 

 

 

 

 

 

 

 

 

 

1.3 設置目標工程為vs工程

1.4  產生vs工程

1.5 打開vs工程,編譯運行程序

 

2 添加子模塊

      對于比較大的工程來說,包含多個子模塊是很常見的事,因為通常每個人只是負責他自己的模塊。那么怎樣將各個模塊加入到主工程中呢?首先我們需要使用cmake來創建各個子模塊的工程,然后再將這些模塊加入到整個工程中。假設現在我們有一個子模塊myhello,它提供了一個函數PrintHelloWorld來打印hello world!,主模塊hello調用這個函數來打印。首先我們在hello.cpp所在目錄創建myhello文件夾,將myhello.cpp和myhello.h放到里面,然后在這個文件夾中創建CMakeLists.txt。這三個文件的具體內容如下:

myhello/myhello.h:

void PrintHelloWorld();

myhello/myhello.cpp

#include <stdio.h>void PrintHelloWorld(){    printf("hello world!");}

myhello/CMakeLists.txt

add_library(myhello myhello.cpp)

這個CMakeLists.txt主要是告訴cmake,為myhello創建一個庫工程。

hello.cpp

復制代碼
#include "myhello/myhello.h"int main (int argc, char *argv[]){    PrintHelloWorld();    return 0;}復制代碼

CMakeLists.txt

復制代碼
cmake_minimum_required(VERSION 3.5)project(hello)add_subdirectory(myhello)set (EXTRA_LIBS ${EXTRA_LIBS} myhello)add_executable(hello hello.cpp)target_link_libraries (hello ${EXTRA_LIBS})復制代碼

       add_subdirectory將myhello子工程加入到主工程,target_link_libraries將子模myhello鏈接到hello中。然后重新cmake下,打開vs就可以編譯運行啦。

3 添加可配置的頭文件

      cmake可以通過可配置的頭文件來產生實際的頭文件,如下面的可配置頭文件hello.h.in,里面@@引用的變量可以通過CMakeLists.txt來設置,最后通過cmake來替換hello.h.in文件中的變量并生成hello.h內容。

hello.h.in

#define VERSION_MAJOR @VERSION_MAJOR@#define VERSION_MINOR @VERSION_MINOR@

CMakeLists.txt

復制代碼
cmake_minimum_required(VERSION 3.5)project(hello)include_directories("${PROJECT_BINARY_DIR}")set(VERSION_MAJOR 1)set(VERSION_MINOR 0)configure_file(    "${PROJECT_SOURCE_DIR}/hello.h.in"    "${PROJECT_BINARY_DIR}/hello.h")add_subdirectory(myhello)set (EXTRA_LIBS ${EXTRA_LIBS} myhello)add_executable(hello hello.cpp)target_link_libraries (hello ${EXTRA_LIBS})復制代碼

上面加紅的命令主要用來設置hello.h.in中的兩個變量,并且讓cmake生成hello.h文件。生成的hello.h如下:

hello.h

#define VERSION_MAJOR 1#define VERSION_MINOR 0

再修改下hello.cpp文件使用這兩個變量,

hello.cpp

復制代碼
#include "myhello/myhello.h"#include "hello.h"#include <stdio.h>int main (int argc, char *argv[]){    printf("version:%d.%d/n", VERSION_MAJOR, VERSION_MINOR);    PrintHelloWorld();    return 0;}復制代碼

打開vs工程,編譯運行輸出者兩個變量的值。這樣就可以通過在CMakeLists.txt中設置變量的內容來動態修改.h文件,增加了代碼的靈活性。

 

4 檢測系統是否有支持工程需要的函數

      對于跨平臺的工程來說,檢查系統是否支持某些特性是很有必要的,這樣程序中就可以通過系統的特性來選擇具體執行哪些代碼。其中檢查是否支持某些函數是我們經常要做的事情,如epoll函數,可能有的linux系統就不支持,對于不支持的系統我們只能用poll來替代等。在cmake中檢查系統是否支持某個函數也很簡單,先包含一個CheckFunctionExists庫,然后使用check_function_exists來判斷就行了。

CMakeLists.txt

復制代碼
cmake_minimum_required(VERSION 3.5)project(hello)include (CheckFunctionExists)check_function_exists (printf HAVE_PRINTF)include_directories("${PROJECT_BINARY_DIR}")set(VERSION_MAJOR 1)set(VERSION_MINOR 0)configure_file(    "${PROJECT_SOURCE_DIR}/hello.h.in"    "${PROJECT_BINARY_DIR}/hello.h")add_subdirectory(myhello)set (EXTRA_LIBS ${EXTRA_LIBS} myhello)add_executable(hello hello.cpp)target_link_libraries (hello ${EXTRA_LIBS})復制代碼

在配置的頭文件hello.h.in中加入#cmakedefine HAVE_PRINTF,這樣如果系統中有printf函數,最終生成的hello.h中會定義HAVE_PRINTF這個宏,否則不會生成這個宏,在hello.cpp文件中可以根據這個宏來是否定義來判斷是否應該使用printf函數。

hello.h.in

#define VERSION_MAJOR @VERSION_MAJOR@#define VERSION_MINOR @VERSION_MINOR@#cmakedefine HAVE_PRINTF

hello.cpp

復制代碼
#include "myhello/myhello.h"#include "hello.h"#include <stdio.h>int main (int argc, char *argv[]){#ifdef HAVE_PRINTF    printf("version:%d.%d/n", VERSION_MAJOR, VERSION_MINOR);#endif    PrintHelloWorld();    return 0;}復制代碼

運行結果:

 

5 配置可選項

有時候代碼可能包含了所有平臺的模塊代碼,但是對于特定的目標平臺,只需要配置該平臺需要模塊的代碼,而不需要配置其它平臺模塊的代碼。這種需求可以通過cmake的配置可選項來完成,配置可選項就是cmake在生成工程的時候提示你一些選項,根據你的選項來具體選擇需要添加到工程中的模塊代碼。例如我現在需要提高是否使用myhello模塊的選項,可以在CMakeLists.txt中加option命令來實現,代碼如下:

復制代碼
cmake_minimum_required(VERSION 3.5)project(hello)include (CheckFunctionExists)check_function_exists (printf HAVE_PRINTF)include_directories("${PROJECT_BINARY_DIR}")set(VERSION_MAJOR 1)set(VERSION_MINOR 0)option (USE_MYHELLO         "Use myhello" ON)         configure_file(    "${PROJECT_SOURCE_DIR}/hello.h.in"    "${PROJECT_BINARY_DIR}/hello.h")add_subdirectory(myhello)set (EXTRA_LIBS ${EXTRA_LIBS} myhello)add_executable(hello hello.cpp)target_link_libraries (hello ${EXTRA_LIBS})復制代碼

并且在hello.h.in中添加由cmake根據選項來定義USE_MYHELLO宏。

#define VERSION_MAJOR @VERSION_MAJOR@#define VERSION_MINOR @VERSION_MINOR@#cmakedefine HAVE_PRINTF#cmakedefine USE_MYHELLO

這樣在運行cmake的時候,會提示我們一些選項來進行選擇:

通過USE_MYHELLO是否被選擇,cmake來確定是否要在hello.h中定義USE_MYHELLO宏,最終我們可以在hello.cpp中判斷USE_MYHELLO宏是否定義來是否使用myhello模塊中的PrintHelloWorld函數。

hello.cpp

復制代碼
#include "myhello/myhello.h"#include "hello.h"#include <stdio.h>int main (int argc, char *argv[]){#ifdef HAVE_PRINTF    printf("version:%d.%d/n", VERSION_MAJOR, VERSION_MINOR);#endif#ifdef USE_MYHELLO    PrintHelloWorld();#else    printf("xx hello world!");#endif    return 0;}復制代碼

最后通過選中或者不選中USE_MYHELLO選擇,得到的結果會不同。

選中結果

沒選中結果:

 

6 總結

      本文主要介紹了下cmake的比較常用的一些命令:project、include、include_directories、set、option、configure_file、add_subdirectory、add_executable、target_link_libraries、add_library,算是一個入門吧。需要用好cmake,熟悉cmake的命令和多寫cmake腳本是必須的,具體每個命令的介紹看以參考官方文檔:https://cmake.org/cmake/help/v3.5/manual/cmake-commands.7.html,腳步的編寫語法可以參考官網文檔:https://cmake.org/cmake/help/v3.5/manual/cmake-language.7.html。以后大點的工程創建完全可以交給cmake來完成,同時也是熟悉cmake的過程。


上一篇:新I/O

下一篇:寶寶無語了之結構體

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久国产a级| 日韩在线视频免费观看| 亚洲国产一区自拍| 日韩在线欧美在线国产在线| 日韩视频亚洲视频| 久久久精品久久| 欧美成在线观看| 992tv成人免费影院| 日韩国产高清视频在线| 亚洲欧美日本伦理| 日韩性生活视频| 国产三级精品网站| 久久天天躁狠狠躁夜夜躁2014| 中文字幕在线观看日韩| 精品久久久精品| 国产精品吊钟奶在线| 欧美老女人在线视频| 在线激情影院一区| 成人性生交大片免费观看嘿嘿视频| 538国产精品一区二区在线| 九九久久国产精品| www国产精品视频| 欧美日韩亚洲一区二| 精品自在线视频| 78m国产成人精品视频| 性色av一区二区咪爱| 欧美一乱一性一交一视频| 日本19禁啪啪免费观看www| 成人欧美在线观看| 精品国产1区2区| 国产成人+综合亚洲+天堂| 成人看片人aa| 国产盗摄xxxx视频xxx69| 国产精品永久在线| 精品久久久久久久中文字幕| 国产一区二区黄| 国产精品久久久av| 亚洲成人网久久久| 久久av在线播放| 亚洲欧美三级伦理| 亚洲国产又黄又爽女人高潮的| 2019亚洲男人天堂| 国产免费一区二区三区在线能观看| 国产精品美女久久久久久免费| 热re99久久精品国产66热| 国产一区二区久久精品| 91产国在线观看动作片喷水| 欧美国产日韩一区二区在线观看| 亚洲综合中文字幕在线| 一区二区三区无码高清视频| 26uuu日韩精品一区二区| 国产日韩中文字幕| 国产欧美精品日韩| 久久久久99精品久久久久| 色先锋久久影院av| 日韩精品欧美激情| 欧美一级大片视频| 精品国产福利视频| 亚洲天堂av综合网| 久久免费在线观看| 国产精品久久久久久亚洲影视| 国产精品第二页| 欧美在线视频免费| 主播福利视频一区| 亚洲www永久成人夜色| 中文字幕9999| 96精品视频在线| 日韩成人av在线播放| 精品国产福利在线| 九色精品免费永久在线| 国产精品露脸自拍| 91精品国产成人www| 日韩视频―中文字幕| 亚洲精品国产精品乱码不99按摩| 久久久久久亚洲| 久久理论片午夜琪琪电影网| 最近中文字幕mv在线一区二区三区四区| 久久久久久久久爱| 久久久天堂国产精品女人| 国产精品免费福利| 日韩欧美aaa| 国产精品久久久久久久久久ktv| 国产精品激情自拍| 日韩精品999| 国产精品91久久久久久| 国产精品一二三在线| 成人夜晚看av| 亚洲男人天堂久| 国产一区二区三区视频| 欧美精品在线免费观看| 91精品视频网站| 亚洲国产欧美在线成人app| 国产91精品不卡视频| 91国产精品视频在线| 日韩国产精品一区| 国内精品久久久久久影视8| 97久久精品人人澡人人爽缅北| 日韩欧美亚洲一二三区| 97精品久久久| 热久久免费视频精品| 国产精品国产自产拍高清av水多| 中文字幕欧美国内| 91精品国产高清久久久久久91| 亚洲国产精品悠悠久久琪琪| 国产男人精品视频| 久久精品亚洲94久久精品| 久久成人免费视频| 中文字幕亚洲欧美日韩高清| 欧美在线不卡区| 国产69精品久久久久久| 成人乱色短篇合集| 成人亚洲综合色就1024| 亚洲国产精品字幕| 成人免费在线视频网站| 国产精品极品美女在线观看免费| 国产91在线播放精品91| 国产成人精品视频在线| 久久视频在线播放| 91高潮精品免费porn| 久久人91精品久久久久久不卡| 国产精品老女人精品视频| 欧美国产日韩精品| 精品小视频在线| 91在线观看欧美日韩| 久久久久久久999| 欧美日本啪啪无遮挡网站| 日韩欧美在线网址| 亚洲精品国产精品国自产在线| 最近免费中文字幕视频2019| 日韩中文在线视频| 91久久在线播放| 福利一区视频在线观看| 欧美激情一区二区三区久久久| 欧美一级电影在线| 人妖精品videosex性欧美| 欧美有码在线观看视频| 麻豆精品精华液| 亚洲国产欧美一区二区丝袜黑人| 日韩欧美精品在线观看| 亚洲午夜激情免费视频| 中文字幕久久久| 45www国产精品网站| 国产精品极品美女在线观看免费| 成人伊人精品色xxxx视频| 91国自产精品中文字幕亚洲| 日韩精品视频在线| 夜夜嗨av色一区二区不卡| 一区二区三区国产在线观看| 亚洲人成人99网站| 精品国产乱码久久久久酒店| 精品久久久国产精品999| 成人亚洲欧美一区二区三区| 亚洲欧美另类国产| 欧美亚州一区二区三区| 亚洲爱爱爱爱爱| 国产一区二区三区直播精品电影| 欧美日韩国产丝袜另类| 日韩免费观看av| 国产精品美女免费看| 日日摸夜夜添一区| 亚洲裸体xxxx| 亚洲aa中文字幕| 国产精品一区二区久久国产| 成人性生交大片免费看小说|