日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

大型工程的管理,CMake快速入門

來源: 責編: 時間:2024-01-24 17:28:47 313觀看
導讀我們先從一個最簡單的場景開始,這種場景就是只有一個源文件的場景。當然,對于單文件的場景我們可以直接通過gcc進行編譯,但是為了說明CMake的用法,我們以此作為起點。后面我們會逐步介紹更加復雜的場景。目的很簡單,主要是

ozT28資訊網——每日最新資訊28at.com

我們先從一個最簡單的場景開始,這種場景就是只有一個源文件的場景。當然,對于單文件的場景我們可以直接通過gcc進行編譯,但是為了說明CMake的用法,我們以此作為起點。后面我們會逐步介紹更加復雜的場景。目的很簡單,主要是為了降低入門的門檻,然后讓大家像上臺階一樣,不知不覺的爬到泰山之巔。ozT28資訊網——每日最新資訊28at.com

單文件的軟件工程

我們可以先創建一個目錄,比如simple,然后在這個目錄中創建一個名稱為main.cpp的C++程序,程序代碼如下所示。ozT28資訊網——每日最新資訊28at.com

#include <iostream>int main(int argc, char** argv){    std::cout << "this is a simple example!" << "/n";    return 0;}

再創建一個名稱為CMakeLists.txt的文件,這個文件正是cmake使用的文件。文件的內容如下,是不是很簡單。ozT28資訊網——每日最新資訊28at.com

cmake_minimum_required(VERSION 3.16)project(CMakeSunny      VERSION 1.0      DESCRIPTION "A CMake Tutorial"      LANGUAGES CXX)add_executable(cmlearn                           main.cpp)

上面文件中cmake_minimum_required用于指定cmake的最低版本號。project用于名稱功能,其中包含工程名稱、版本信息和工程描述等信息。最后add_executable則用于指定編程后的可執行文件名稱以及源代碼文件。ozT28資訊網——每日最新資訊28at.com

具備上述兩個文件后,在根目錄下面創建一個名稱為build的目錄,然后切換到目錄下面,執行cmake就可以生成一個Makefile文件。然后執行make命令就可以編譯出二進制文件來。具體執行的命令如下:ozT28資訊網——每日最新資訊28at.com

mkdir buildcd buildcmake ..make

下圖展示了上述文件的關系,main.cpp和CMakeLists.txt是我們創建的。目錄build中的目錄和文件分別是通過cmake和make命令生成的。最終生成的二進制文件也是在build目錄中,名稱為cmlearn,這個名稱是在CMakeLists.txt定義的。ozT28資訊網——每日最新資訊28at.com

ozT28資訊網——每日最新資訊28at.com

多文件的軟件工程

更進一步,如果我們的軟件工程通常包含不止一個文件,比如我們這里增加一個做加法的函數,這個函數在一個獨立的文件中。此時工程中包含3個獨立的文件,分別為main.cpp、add.cpp和頭文件add.h。此時我們自己創建的文件目錄結構如下圖所示。ozT28資訊網——每日最新資訊28at.com

ozT28資訊網——每日最新資訊28at.com

接下來我們只需要做很簡單的改動就可以將新文件的內容編譯進來。如下代碼所示,我們在add_executable中添加add.cpp文件即可。ozT28資訊網——每日最新資訊28at.com

cmake_minimum_required(VERSION 3.16)project(CMakeSunny    VERSION 1.0    DESCRIPTION "A CMake Tutorial"    LANGUAGES CXX)add_executable(add    main.cpp    add.cpp)

上述add.cpp文件的內容如下所示,其功能很簡單,就是實現一個加法功能。ozT28資訊網——每日最新資訊28at.com

int add(int a, int b){    return a+b;}

頭文件的實現更加簡單,具體內容如下所示。需要注意的是,我們這里僅僅是為了延時CMake的功能,很多產品級必須的代碼名沒有寫到這里。ozT28資訊網——每日最新資訊28at.com

int add(int a, int b);

為了驗證實現的正確性,我們可以在main.cpp中做一些修改,引用在add.cpp中實現的函數。具體修改后的內容如下所示。ozT28資訊網——每日最新資訊28at.com

#include <iostream>#include "add.h"int main(int argc, char** argv){    int r = add(1, 3);    std::cout << "this is a simple example!" << r << "/n";    return 0;}

完成上述修改后,大家可以切回到build目錄中,重新執行cmake ..和make命令,可以看到生成了新的二進制文件cmlearn。我們可以執行一下這個程序,可以看到結果符合預期。ozT28資訊網——每日最新資訊28at.com

包含子目錄的軟件工程

實際的大型項目比上面介紹的還要復雜的多。比如上文我們提到實現了一個加法功能的add.cpp文件。比如我們又要實現減法、乘法和除法等功能,也都是在獨立的文件中實現。那么這些計算的實現最好放到一個目錄中,比如math目錄。在大型項目中經常會這樣組織源代碼,一個功能模塊的代碼,或者詳細功能的代碼被組織在一個子目錄中。ozT28資訊網——每日最新資訊28at.com

這是源代碼會被組織成如下圖所示的結構,而且在子目錄math中也需要新建一個名稱為CMakeLists.txt文件。該文件的內容可以非常簡單,具體如下所示,是不是很簡單!ozT28資訊網——每日最新資訊28at.com

add_library(math OBJECT sub.cpp                                          add.cpp)

函數add_library用于創建一個庫,這里的庫與Linux的動態庫和靜態庫的概念基本對應,但不完全一樣。本例是創建一個OBJECT類型的庫,其實就是生成目標文件。如前文所述,這個函數可以創建Linux的動態庫和靜態庫,我們后面會詳細介紹一下這方面的內容。ozT28資訊網——每日最新資訊28at.com

ozT28資訊網——每日最新資訊28at.com

如下是該函數的幾種應用場景,比如STATIC是靜態庫,SHARED是動態庫,OBJECT則是我們當前使用的目標文件。另外還有MODULE、INTERFACE和IMPORTED等類型。ozT28資訊網——每日最新資訊28at.com

add_library(<name> [STATIC | SHARED | MODULE]    [EXCLUDE_FROM_ALL]    [<source>...])add_library(<name> OBJECT [<source>...])add_library(<name> INTERFACE)add_library(<name> <type> IMPORTED [GLOBAL])

有了子目錄中的CMakeLists.txt還不夠,我們需要在根目錄的CMakeLists.txt添加一些內容,建立根目錄與子目錄math的聯系。建立聯系很簡單,我們只需要在根目錄的CMakeLists.txt中添加如下一行代碼即可。ozT28資訊網——每日最新資訊28at.com

add_subdirectory(math)

當添加上述代碼后,我們在build目錄再次執行cmake命令的時候可以觸發子目錄生成Makefile文件。而執行make命令進行編譯的時候,可以觸發子目錄的編譯,生成目標文件。ozT28資訊網——每日最新資訊28at.com

target_link_libraries(cmlearn PUBLIC math)

上述函數實現了鏈接的功能,將子模塊math鏈接到了主模塊main上,最終會生成一個可執行程序。但是我們在源代碼層面還沒有任何更該,主程序也沒有調用add.cpp和sub.cpp中的任何函數,所以實際上也不存在鏈接的過程。ozT28資訊網——每日最新資訊28at.com

如果讓主程序調用math中的函數,首先需要在主程序中包含頭文件。在CMakeLists.txt中需要添加如下代碼來告訴編譯器頭文件的位置。否則在編譯的時候會有找不到頭文件的錯誤提示。ozT28資訊網——每日最新資訊28at.com

target_include_directories(cmlearn PUBLIC    "${PROJECT_SOURCE_DIR}/math")

完成CMakeLists.txt的修改后,我們最后需要修改一下主程序。修改主程序的目的主要是讓主程序調用math中實現的函數。修改后的主程序如下所示,在主程序中調用了add和sub兩個函數,并且在一開始包含了add.h和sub.h兩個文件。ozT28資訊網——每日最新資訊28at.com

#include <iostream>#include "add.h"#include "sub.h"int main(int argc, char** argv){    int sum = add(1, 3);    int diff = sub(3, 1);    std::cout << "The sum of 1 and 3 is " << sum << std::endl;    std::cout << "The diff of 3 and 1 is " << diff << std::endl;    return 0;}

完成上述修改后,我們可以在build目錄執行“cmake ..”命令,然后執行make命令編譯程序,最后可以得到一個可執行程序。ozT28資訊網——每日最新資訊28at.com

通過上面的舉例,我們對通過CMake來維護一個大型的軟件項目有了一個初步的了解。實際上CMake實現的功能還要豐富的多, 我們在后續會詳細介紹。ozT28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-67349-0.html大型工程的管理,CMake快速入門

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C++為什么要使用異常?

下一篇: 通過.NET Core+Vue3 實現SignalR即時通訊功能

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
午夜精品一区二区三区在线播放| 国产一区二区三区在线观看视频| 欧美成人蜜桃| 免费国产一区二区| 欧美另类videos死尸| 欧美午夜一区二区| 国产精品综合网站| 亚洲成人自拍视频| 日韩亚洲一区二区| 午夜精品成人在线| 久久亚洲精品一区二区| 欧美第一黄色网| 欧美噜噜久久久xxx| 国产精品视区| 亚洲国产精品日韩| 亚洲一区二区高清视频| 久久噜噜噜精品国产亚洲综合| 欧美国产视频在线观看| 国产精品视频区| 久久久国产精品一区二区中文 | 在线亚洲一区| 久久成人人人人精品欧| 欧美高清不卡| 国产欧美一区在线| 亚洲欧洲在线观看| 欧美一区二区三区日韩视频| 欧美国产第一页| 国产欧美在线视频| 亚洲美女在线观看| 久久久久久久999| 欧美视频国产精品| 亚洲国产高清在线| 欧美一区二区三区视频免费| 欧美日韩福利在线观看| 韩国久久久久| 亚洲尤物视频在线| 欧美成人一区在线| 国产在线高清精品| 亚洲一区二区三区免费观看| 老司机免费视频一区二区| 国产精品久久久久影院色老大| 亚洲国产精品成人久久综合一区| 亚洲欧美综合v| 欧美激情在线播放| 伊人春色精品| 欧美一区二区三区日韩| 欧美丝袜一区二区三区| 亚洲人在线视频| 久久久xxx| 国产精品色在线| 一区二区三区高清| 欧美国产日韩精品| 依依成人综合视频| 久久精品一区| 国产欧美视频一区二区三区| 中国成人亚色综合网站| 欧美激情第9页| 在线精品国产成人综合| 久久av资源网站| 国产精品网站在线| 亚洲性av在线| 欧美日韩一区在线观看| 亚洲毛片一区二区| 欧美大片免费观看| 亚洲第一中文字幕| 久久婷婷国产综合国色天香| 国产一区二区三区久久久久久久久| 亚洲专区国产精品| 国产精品久久久久久久第一福利| 亚洲作爱视频| 欧美日韩精品免费观看视一区二区| 在线免费观看欧美| 巨胸喷奶水www久久久免费动漫| 国产欧美日韩综合一区在线播放| 亚洲你懂的在线视频| 欧美亚洲不卡| 亚洲一二三区在线观看| 欧美视频在线一区| 亚洲天堂av在线免费观看| 欧美三级韩国三级日本三斤| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美日韩国产成人| 亚洲精品一区二| 欧美国产精品日韩| 亚洲精品国产精品久久清纯直播| 欧美成人精品h版在线观看| 亚洲国产精品123| 欧美高清视频在线播放| 亚洲另类黄色| 欧美日韩免费| 亚洲一区免费在线观看| 国产精品永久入口久久久| 羞羞色国产精品| 韩日视频一区| 免费在线成人av| 亚洲巨乳在线| 欧美视频一区二| 亚洲欧美日韩一区二区在线| 国产欧美一区二区精品性| 久久久久成人精品| 亚洲大片av| 欧美久久视频| 亚洲一区二区三区涩| 国产日韩精品一区二区三区在线| 久久久九九九九| 亚洲精品久久久久久一区二区| 欧美日韩精品一区视频| 亚洲一区自拍| 国产在线精品一区二区中文| 久久香蕉国产线看观看av| 91久久夜色精品国产网站| 欧美日韩在线视频一区| 性欧美大战久久久久久久免费观看| 狠狠色2019综合网| 欧美精品免费视频| 亚洲欧美日韩国产综合| 狠狠入ady亚洲精品| 欧美国产视频一区二区| 亚洲一区一卡| 国产字幕视频一区二区| 欧美成人一区二区| 亚洲一区二区三区免费观看 | 在线亚洲欧美视频| 国产日韩一区| 免费欧美在线| 亚洲一区二区三区精品在线观看| 国产一区二区三区奇米久涩| 欧美91精品| 亚洲一区www| 永久免费精品影视网站| 欧美日韩免费网站| 欧美一区二区三区视频在线| 亚洲黑丝一区二区| 国产精品一区免费视频| 欧美99在线视频观看| 亚洲综合首页| 亚洲国产一区二区精品专区| 国产精品igao视频网网址不卡日韩| 久久国产日韩| 99精品国产在热久久婷婷| 国产亚洲第一区| 欧美日韩123| 久久精品成人欧美大片古装| 亚洲麻豆视频| 国产午夜亚洲精品不卡| 欧美日韩大片一区二区三区| 久久激情视频久久| 这里只有精品丝袜| 在线免费观看日韩欧美| 国产精品日韩一区二区| 欧美福利视频| 久久精品色图| 亚洲综合欧美| 亚洲人成亚洲人成在线观看| 国产欧美一区二区三区在线看蜜臀| 欧美激情亚洲激情| 久久久久**毛片大全| 亚洲在线观看视频网站| 亚洲日本无吗高清不卡| 韩日精品视频| 国产九九精品| 欧美深夜福利| 欧美护士18xxxxhd| 久久全球大尺度高清视频| 亚洲欧美日韩在线观看a三区| 日韩天天综合| 亚洲国产女人aaa毛片在线| 国产日韩欧美三区| 国产精品久久国产精品99gif| 欧美激情91| 久久五月激情| 久久成人精品视频| 亚洲欧美中文另类| 中文亚洲视频在线| 亚洲精品视频在线看| 一区二区亚洲精品国产| 国产一区二区成人久久免费影院| 国产精品xnxxcom| 欧美日韩系列| 欧美精品久久久久a| 免费成人av| 久久一二三国产| 久久久久久黄| 久久久精品免费视频| 欧美有码视频| 欧美亚洲一区二区三区| 亚洲欧美日韩国产一区二区三区| 亚洲视频在线看| 正在播放亚洲| 亚洲视频综合| 亚洲午夜精品视频| 亚洲一区二区三区国产| 中文欧美日韩| 在线视频亚洲欧美| 一二美女精品欧洲| 一区二区av在线| 夜夜躁日日躁狠狠久久88av| 99视频热这里只有精品免费| 99精品久久免费看蜜臀剧情介绍| 亚洲区国产区| 日韩亚洲国产欧美| 宅男在线国产精品| 亚洲永久在线| 欧美一区二区大片|