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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

大型工程的管理,CMake快速入門(mén)

來(lái)源: 責(zé)編: 時(shí)間:2024-01-24 17:28:47 240觀看
導(dǎo)讀我們先從一個(gè)最簡(jiǎn)單的場(chǎng)景開(kāi)始,這種場(chǎng)景就是只有一個(gè)源文件的場(chǎng)景。當(dāng)然,對(duì)于單文件的場(chǎng)景我們可以直接通過(guò)gcc進(jìn)行編譯,但是為了說(shuō)明CMake的用法,我們以此作為起點(diǎn)。后面我們會(huì)逐步介紹更加復(fù)雜的場(chǎng)景。目的很簡(jiǎn)單,主要是

ISk28資訊網(wǎng)——每日最新資訊28at.com

我們先從一個(gè)最簡(jiǎn)單的場(chǎng)景開(kāi)始,這種場(chǎng)景就是只有一個(gè)源文件的場(chǎng)景。當(dāng)然,對(duì)于單文件的場(chǎng)景我們可以直接通過(guò)gcc進(jìn)行編譯,但是為了說(shuō)明CMake的用法,我們以此作為起點(diǎn)。后面我們會(huì)逐步介紹更加復(fù)雜的場(chǎng)景。目的很簡(jiǎn)單,主要是為了降低入門(mén)的門(mén)檻,然后讓大家像上臺(tái)階一樣,不知不覺(jué)的爬到泰山之巔。ISk28資訊網(wǎng)——每日最新資訊28at.com

單文件的軟件工程

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

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

再創(chuàng)建一個(gè)名稱為CMakeLists.txt的文件,這個(gè)文件正是cmake使用的文件。文件的內(nèi)容如下,是不是很簡(jiǎn)單。ISk28資訊網(wǎng)——每日最新資訊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的最低版本號(hào)。project用于名稱功能,其中包含工程名稱、版本信息和工程描述等信息。最后add_executable則用于指定編程后的可執(zhí)行文件名稱以及源代碼文件。ISk28資訊網(wǎng)——每日最新資訊28at.com

具備上述兩個(gè)文件后,在根目錄下面創(chuàng)建一個(gè)名稱為build的目錄,然后切換到目錄下面,執(zhí)行cmake就可以生成一個(gè)Makefile文件。然后執(zhí)行make命令就可以編譯出二進(jìn)制文件來(lái)。具體執(zhí)行的命令如下:ISk28資訊網(wǎng)——每日最新資訊28at.com

mkdir buildcd buildcmake ..make

下圖展示了上述文件的關(guān)系,main.cpp和CMakeLists.txt是我們創(chuàng)建的。目錄build中的目錄和文件分別是通過(guò)cmake和make命令生成的。最終生成的二進(jìn)制文件也是在build目錄中,名稱為cmlearn,這個(gè)名稱是在CMakeLists.txt定義的。ISk28資訊網(wǎng)——每日最新資訊28at.com

ISk28資訊網(wǎng)——每日最新資訊28at.com

多文件的軟件工程

更進(jìn)一步,如果我們的軟件工程通常包含不止一個(gè)文件,比如我們這里增加一個(gè)做加法的函數(shù),這個(gè)函數(shù)在一個(gè)獨(dú)立的文件中。此時(shí)工程中包含3個(gè)獨(dú)立的文件,分別為main.cpp、add.cpp和頭文件add.h。此時(shí)我們自己創(chuàng)建的文件目錄結(jié)構(gòu)如下圖所示。ISk28資訊網(wǎng)——每日最新資訊28at.com

ISk28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái)我們只需要做很簡(jiǎn)單的改動(dòng)就可以將新文件的內(nèi)容編譯進(jìn)來(lái)。如下代碼所示,我們?cè)赼dd_executable中添加add.cpp文件即可。ISk28資訊網(wǎng)——每日最新資訊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文件的內(nèi)容如下所示,其功能很簡(jiǎn)單,就是實(shí)現(xiàn)一個(gè)加法功能。ISk28資訊網(wǎng)——每日最新資訊28at.com

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

頭文件的實(shí)現(xiàn)更加簡(jiǎn)單,具體內(nèi)容如下所示。需要注意的是,我們這里僅僅是為了延時(shí)CMake的功能,很多產(chǎn)品級(jí)必須的代碼名沒(méi)有寫(xiě)到這里。ISk28資訊網(wǎng)——每日最新資訊28at.com

int add(int a, int b);

為了驗(yàn)證實(shí)現(xiàn)的正確性,我們可以在main.cpp中做一些修改,引用在add.cpp中實(shí)現(xiàn)的函數(shù)。具體修改后的內(nèi)容如下所示。ISk28資訊網(wǎng)——每日最新資訊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目錄中,重新執(zhí)行cmake ..和make命令,可以看到生成了新的二進(jìn)制文件cmlearn。我們可以執(zhí)行一下這個(gè)程序,可以看到結(jié)果符合預(yù)期。ISk28資訊網(wǎng)——每日最新資訊28at.com

包含子目錄的軟件工程

實(shí)際的大型項(xiàng)目比上面介紹的還要復(fù)雜的多。比如上文我們提到實(shí)現(xiàn)了一個(gè)加法功能的add.cpp文件。比如我們又要實(shí)現(xiàn)減法、乘法和除法等功能,也都是在獨(dú)立的文件中實(shí)現(xiàn)。那么這些計(jì)算的實(shí)現(xiàn)最好放到一個(gè)目錄中,比如math目錄。在大型項(xiàng)目中經(jīng)常會(huì)這樣組織源代碼,一個(gè)功能模塊的代碼,或者詳細(xì)功能的代碼被組織在一個(gè)子目錄中。ISk28資訊網(wǎng)——每日最新資訊28at.com

這是源代碼會(huì)被組織成如下圖所示的結(jié)構(gòu),而且在子目錄math中也需要新建一個(gè)名稱為CMakeLists.txt文件。該文件的內(nèi)容可以非常簡(jiǎn)單,具體如下所示,是不是很簡(jiǎn)單!ISk28資訊網(wǎng)——每日最新資訊28at.com

add_library(math OBJECT sub.cpp                                          add.cpp)

函數(shù)add_library用于創(chuàng)建一個(gè)庫(kù),這里的庫(kù)與Linux的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的概念基本對(duì)應(yīng),但不完全一樣。本例是創(chuàng)建一個(gè)OBJECT類(lèi)型的庫(kù),其實(shí)就是生成目標(biāo)文件。如前文所述,這個(gè)函數(shù)可以創(chuàng)建Linux的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù),我們后面會(huì)詳細(xì)介紹一下這方面的內(nèi)容。ISk28資訊網(wǎng)——每日最新資訊28at.com

ISk28資訊網(wǎng)——每日最新資訊28at.com

如下是該函數(shù)的幾種應(yīng)用場(chǎng)景,比如STATIC是靜態(tài)庫(kù),SHARED是動(dòng)態(tài)庫(kù),OBJECT則是我們當(dāng)前使用的目標(biāo)文件。另外還有MODULE、INTERFACE和IMPORTED等類(lèi)型。ISk28資訊網(wǎng)——每日最新資訊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添加一些內(nèi)容,建立根目錄與子目錄math的聯(lián)系。建立聯(lián)系很簡(jiǎn)單,我們只需要在根目錄的CMakeLists.txt中添加如下一行代碼即可。ISk28資訊網(wǎng)——每日最新資訊28at.com

add_subdirectory(math)

當(dāng)添加上述代碼后,我們?cè)赽uild目錄再次執(zhí)行cmake命令的時(shí)候可以觸發(fā)子目錄生成Makefile文件。而執(zhí)行make命令進(jìn)行編譯的時(shí)候,可以觸發(fā)子目錄的編譯,生成目標(biāo)文件。ISk28資訊網(wǎng)——每日最新資訊28at.com

target_link_libraries(cmlearn PUBLIC math)

上述函數(shù)實(shí)現(xiàn)了鏈接的功能,將子模塊math鏈接到了主模塊main上,最終會(huì)生成一個(gè)可執(zhí)行程序。但是我們?cè)谠创a層面還沒(méi)有任何更該,主程序也沒(méi)有調(diào)用add.cpp和sub.cpp中的任何函數(shù),所以實(shí)際上也不存在鏈接的過(guò)程。ISk28資訊網(wǎng)——每日最新資訊28at.com

如果讓主程序調(diào)用math中的函數(shù),首先需要在主程序中包含頭文件。在CMakeLists.txt中需要添加如下代碼來(lái)告訴編譯器頭文件的位置。否則在編譯的時(shí)候會(huì)有找不到頭文件的錯(cuò)誤提示。ISk28資訊網(wǎng)——每日最新資訊28at.com

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

完成CMakeLists.txt的修改后,我們最后需要修改一下主程序。修改主程序的目的主要是讓主程序調(diào)用math中實(shí)現(xiàn)的函數(shù)。修改后的主程序如下所示,在主程序中調(diào)用了add和sub兩個(gè)函數(shù),并且在一開(kāi)始包含了add.h和sub.h兩個(gè)文件。ISk28資訊網(wǎng)——每日最新資訊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目錄執(zhí)行“cmake ..”命令,然后執(zhí)行make命令編譯程序,最后可以得到一個(gè)可執(zhí)行程序。ISk28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)上面的舉例,我們對(duì)通過(guò)CMake來(lái)維護(hù)一個(gè)大型的軟件項(xiàng)目有了一個(gè)初步的了解。實(shí)際上CMake實(shí)現(xiàn)的功能還要豐富的多, 我們?cè)诤罄m(xù)會(huì)詳細(xì)介紹。ISk28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

下一篇: 通過(guò).NET Core+Vue3 實(shí)現(xiàn)SignalR即時(shí)通訊功能

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • K60 Pro官方停產(chǎn) 第三方瞬間漲價(jià)

    雖然沒(méi)有官方宣布,但Redmi的一些高管也已經(jīng)透露了,Redmi K60 Pro已經(jīng)停產(chǎn)且不會(huì)補(bǔ)貨,這一切都是為了即將到來(lái)的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機(jī)在停產(chǎn)之后
  • 消息稱迪士尼要拍真人版《魔發(fā)奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實(shí)有點(diǎn)忙,忙著將不少動(dòng)畫(huà)改成真人版,繼《美人魚(yú)》后,真人版《白雪公主》、《魔發(fā)奇緣》也在路上了。據(jù)外媒消息稱,迪士尼將打造真人版
  • 服務(wù)存儲(chǔ)設(shè)計(jì)模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數(shù)據(jù)從主存儲(chǔ)加載到KV緩存中,加速后續(xù)的訪問(wèn)。在存在重復(fù)度的場(chǎng)景,Cache-Aside可以提升服務(wù)性能,降低底層存儲(chǔ)的壓力,缺點(diǎn)是緩存和底
  • 一文掌握 Golang 模糊測(cè)試(Fuzz Testing)

    模糊測(cè)試(Fuzz Testing)模糊測(cè)試(Fuzz Testing)是通過(guò)向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來(lái)發(fā)現(xiàn)軟件漏洞的方法。可以用來(lái)發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 破圈是B站頭上的緊箍咒

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準(zhǔn)追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛(ài)奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 新電商三兄弟,“抖快紅”成團(tuán)!

    來(lái)源:價(jià)值研究所作 者:Hernanderz 隨著內(nèi)容電商的概念興起,抖音、快手、小紅書(shū)組成的&ldquo;新電商三兄弟&rdquo;成為業(yè)內(nèi)一股不可忽視的勢(shì)力,給阿里、京東、拼多多帶去了巨大壓
  • 馮提莫簽約抖音公會(huì) 前“斗魚(yú)一姐”消失在直播間

    來(lái)源:直播觀察提起&ldquo;馮提莫&rdquo;這個(gè)名字,很多網(wǎng)友或許聽(tīng)過(guò),但應(yīng)該不記得她是哪位主播了。其實(shí),作為曾經(jīng)的&ldquo;斗魚(yú)一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強(qiáng)5G Soc

    去年底,iQOO推出了“電競(jìng)旗艦”iQOO 11系列,作為一款性能強(qiáng)機(jī),iQOO 11不僅全球首發(fā)2K 144Hz E6全感屏,搭載了第二代驍龍8平臺(tái)及144Hz電競(jìng)屏,同時(shí)在快充
  • SN570 NVMe SSD固態(tài)硬盤(pán) 價(jià)格與性能兼具

    SN570 NVMe SSD固態(tài)硬盤(pán)是西部數(shù)據(jù)發(fā)布的最新一代WD Blue系列的固態(tài)硬盤(pán),不僅閃存技術(shù)更為精進(jìn),性能也得到了進(jìn)一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 主站蜘蛛池模板: 斗六市| 砀山县| 江油市| 夏河县| 利川市| 佛冈县| 子洲县| 太白县| 常州市| 满城县| 贺兰县| 重庆市| 萍乡市| 中阳县| 竹溪县| 阿鲁科尔沁旗| 潼关县| 清流县| 达州市| 永靖县| 遂溪县| 乐都县| 佛冈县| 洛阳市| 崇州市| 都江堰市| 赫章县| 南昌县| 甘南县| 扎兰屯市| 富锦市| 塔城市| 夏河县| 阳谷县| 兰西县| 年辖:市辖区| 砀山县| 大英县| 达日县| 璧山县| 乾安县|