最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++項目構(gòu)成從cmake使用基礎(chǔ)詳解

 更新時間:2023年11月12日 17:17:15   作者:xianghanfeng  
這篇文章主要為大家介紹了c++項目構(gòu)成,從cmake使用基礎(chǔ)開始為大家講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

c++項目構(gòu)成及cmake使用基礎(chǔ)知識

c++項目構(gòu)成

c++項目代碼目錄組成

一個良好的代碼目錄結(jié)構(gòu)如下

為何需要注意代碼的目錄結(jié)構(gòu)

一個良好的代碼目錄有助于代碼的管理以及項目的共享。如果所有代碼的頭文件以及相應(yīng)的實現(xiàn)源文件在一個文件夾下面使得項目較為混亂,長時間后項目的創(chuàng)建者自己都難以理清,更不用說別人進行理解。

各組成部分詳解

  • 以上圖為例,該項目的名稱為test2。
  • 項目的頭文件放在include文件夾下。
  • 項目的源文件(大部分為頭文件的實現(xiàn))放在src文件夾下。項目的主函數(shù)(實現(xiàn)項目的功能)為main.cpp。
  • 項目的最頂層的cmake文件為CMakeList.txt。
  • build文件夾是為了防止cmake執(zhí)行后產(chǎn)生的文件使得項目的目錄變得混亂而創(chuàng)建文件夾。
  • .vscode是vscode所產(chǎn)生的,可以放一些vscode的配置文件(使得vscode進行項目的調(diào)試更加方便等作用)。

C++編譯鏈接

  • 編譯各個cpp文件

    • 一個c++程序的各個部分可以放在不同的cpp文件中,每個cpp文件之間都是相對獨立的,只要知道相應(yīng)聲明就能可以進行編譯。形成.o文件。
    • 鏈接使得程序的各個部分相互協(xié)作起來完成程序的功能,即將生成的各個.o文件進行鏈接形成一個可執(zhí)行文件。

c++項目中常見文件及其關(guān)系

  • 頭文件(.h結(jié)尾)

    • 頭文件中主要是變量的聲明,函數(shù)名的聲明,類的定義(相關(guān)行為的實現(xiàn)一般在源文件中編寫,比如內(nèi)聯(lián)函數(shù)就可在頭文件中實現(xiàn)),各種宏定義等。如果我們復用別人的代碼,如ncnn中的某些數(shù)據(jù)結(jié)構(gòu),某些函數(shù)時,需要包含別人的頭文件。這樣編譯器才知道這是什么意思。
    • include是一個預編譯命令,將相應(yīng)頭文件的內(nèi)容復制進相應(yīng)文件,使得編譯器知道這是個啥。
    • include < headfilepatch>這種尖括號形式搜索路徑順序

      編譯器設(shè)置的頭文件查找路徑,編譯器有默認的查找路徑,也可以使用I顯示指定

      系統(tǒng)路徑

    • include "headfilepatch"這種雙引號的形式搜索路徑順序

      當前源文件的所在工作目錄

      編譯器設(shè)置的頭文件查找路徑,編譯器有默認的查找路徑,也可以使用I顯示指定

      系統(tǒng)路徑

    • 兩種include的主要注意點

      • 對于名字不沖突的,使用兩種均可(標準庫文件只要不和自定義文件名字沖突,兩種方式都能找到),對于名字沖突的,使用雙引號,就會優(yōu)先使用自定義的,故復用別人代碼注意名字沖突的問題。
      • 使用I指定搜索路徑的使用,使得搜索路徑的可掌握性。
      • 養(yǎng)成良好的include習慣,防止出現(xiàn)所包含的頭文件和自己想象的不一樣,尤其是自定義的頭文件可能存在沖突時源文件(.cpp結(jié)尾)
  • 源文件

    • 主要是對函數(shù)的實現(xiàn)
  • 庫(.so或者.a結(jié)尾)

    • 庫是別人的可復用代碼編譯形成目標文件集合,可以將其編譯成靜態(tài)庫或者動態(tài)庫,與一般的編譯產(chǎn)生的.o文件一樣,最后是要鏈接到程序中的。
    • 靜態(tài)庫(.a),在運行之前就會將靜態(tài)庫相關(guān)目標文件鏈接到最終的可執(zhí)行文件中,使得程序運行是不需要依賴庫。會產(chǎn)生同樣的目標文件在程序多處存在的問題,使得最終可執(zhí)行文件較大且?guī)斓母螺^為苦難。
    • 動態(tài)庫(.so)在運行時才被鏈接,使得程序運行時依賴庫。但其節(jié)約內(nèi)存,且動態(tài)庫的更新相對容易。

cmake使用基礎(chǔ)知識

  • 什么是cmake

    • camke是一個跨平臺的編譯工具,使得可以使用簡單的語法描述一個項目的編譯過程(先編譯哪些源文件,哪些編譯成靜態(tài)庫,哪些編譯成動態(tài)庫,編譯目標放在哪里等等)。
  • 為何使用cmake

    • 一個良好的c++程序由很多的源文件組成,當文件數(shù)量較少時可以較為方便且快速地手工一個一個分別編譯然后鏈接起來。但當文件數(shù)量變多后,每次都手工一個個編譯文件就非常繁瑣。比如一個c++項目中由兩個.cpp文件時,編譯命令的參數(shù)只用輸入兩個,此時就算從頭分別編譯也較為方便,但當項目由上百個.cpp文件構(gòu)成時,如果還是使用命令進行編譯,則會非常繁瑣。而使用cmake可以將編譯參數(shù)寫下,使得可重復使用,極大簡化編譯過程。
    • 且當一個c++項目的編譯過程較為復雜時,比如哪些編譯為靜態(tài)庫,哪些編譯為動態(tài)庫,編譯輸出位置及其間的關(guān)系是什么樣的等,將項目共享給其它人時,被共享者需要知道上述信息,如果項目作者沒有使用一種簡單的方式提供上述信息,將花費許多不必要的精力在項目編譯上。而cmake使得使用簡單的語法就可以描述項目的編譯過程,使得被共享者知道編譯信息且只需要使用make命令就能實現(xiàn)項目的編譯,使得項目易于共享。
    • 使用cmake可以使得一個c++項目根據(jù)不同平臺生成相應(yīng)的代碼版本。同時可以有效控制一個大型項目中某個單元的修改后重新編譯、測試等過程,使得大型項目的開發(fā)、調(diào)試、發(fā)布更加高效且便利。
  • 如何使用cmake

    • 使用cmake的大致過程為:編寫cmakelists;創(chuàng)建build文件保證項目整潔度;進入build文件夾執(zhí)行cmake及make命令完成編譯得到結(jié)果。

一個簡單的cmakelists如下

  • 一個經(jīng)過簡單代碼分類組織的c++項目編譯過程需要知道項目的頭文件,源文件,庫生成、庫鏈接等信息。上圖所示cmake可以有效描述并控制實現(xiàn)該編譯過程。

    • cmake_minimum_required(version 版本號) 是指定cmake的最低版本號,每個cmakelists一般都有這條命令。
    • project(項目名稱) 是指定項目名稱。
    • set(var [value]) set命令用于顯示定義變量。圖中用于添加編譯選項(包括顯示警告、生成可調(diào)試目標)
    • include_directories() 用于指定項目頭文件目錄。其中用 ${變量名}的方式使用了變量。CMAKE_SOURCE_DIR的值為最外層cmakelists所在目錄。
    • file() 將文件加入到某個變量中,需要具體到文件名。使得可以用一個變量代表多個文件,使得cmake更加簡潔。CMAKE_CURRENT_SOURCE_DIR 的值為當前正在處理的cmakelists的目錄。
    • message() 用于在編譯過程中輸出某些信息,以便于更好地掌握編譯過程。
    • add_library(庫名 庫類型 源文件) 用于生成一個庫。
    • add_executable(目標名 源文件) 用于編譯源文件生成可執(zhí)行文件。
    • target_link_libraries(可執(zhí)行文件名 鏈接方式 庫名 ) 用與add_executable命令后,實現(xiàn)可執(zhí)行文件與動態(tài)庫的鏈接。
  • 當編寫好cmakelists后,可以在項目最外層目錄中創(chuàng)建一個build文件夾以存放編譯生成的中間產(chǎn)物以及可執(zhí)行文件等,以讓項目目錄更加整潔。
  • 接下來就可以執(zhí)行命令完成編譯得到結(jié)果。

    • 先進入到build文件夾中。執(zhí)行cmake 命令生成makefile。cmake命令需要指定cmakelists所在路徑(故一個目錄層面中只能有一個cmakelists)。故在build文件中執(zhí)行cmake .. 因為cmakelists在build文件夾外面。
    • 然后在build中執(zhí)行make命令執(zhí)行makefile啟動編譯并得到結(jié)果。make命令需要指定makefile所在路徑,由于當前操作makefile就在build文件夾中,故此時只需要執(zhí)行make命令即可。

以上就是c++項目構(gòu)成從cmake使用基礎(chǔ)詳解的詳細內(nèi)容,更多關(guān)于c++ cmake項目構(gòu)成的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實現(xiàn)窗口抖動

    C語言實現(xiàn)窗口抖動

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)窗口抖動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語言如何讀取bmp圖像

    C語言如何讀取bmp圖像

    這篇文章主要介紹了C語言如何讀取bmp圖像,BMP即bitmap,由文件頭信息塊、圖像描述信息塊、顏色表、圖像數(shù)據(jù)區(qū)四部分組成,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • C++實現(xiàn)加減乘除計算器

    C++實現(xiàn)加減乘除計算器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)加減乘除計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • 不要被C++(自動生成規(guī)則)所蒙騙

    不要被C++(自動生成規(guī)則)所蒙騙

    正如標題所說,我們不要被C++語法中所描述的那些條條框框所“蒙騙”了。的確,相信這些生成規(guī)則不會對我們的編程帶來多大的影響(不會產(chǎn)生錯誤),但是只有了解它們的背后操作,我們才知道編譯器究竟為我們做了什么,感興趣的朋友可以了解下,希望本文對你有所幫助
    2013-01-01
  • C語言詳解無頭單向非循環(huán)鏈表各種操作方法

    C語言詳解無頭單向非循環(huán)鏈表各種操作方法

    無頭單向非循環(huán)鏈表:結(jié)構(gòu)簡單,一般不會單獨用來存數(shù)據(jù)。實際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多
    2022-04-04
  • C語言中讀取時間日期的基本方法

    C語言中讀取時間日期的基本方法

    這篇文章主要介紹了C語言中讀取時間日期的基本方法,分別是time()函數(shù)和gmtime()函數(shù)的使用,注意返回值的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++ CryptoPP使用AES實現(xiàn)加解密詳解

    C++ CryptoPP使用AES實現(xiàn)加解密詳解

    Crypto++ (CryptoPP) 是一個用于密碼學和加密的 C++ 庫,提供了大量的密碼學算法和功能,這篇文章主要為大家介紹了C++ CryptoPP如何使用AES實現(xiàn)加解密,需要的可以參考下
    2023-11-11
  • 使用Qt實現(xiàn)獲取本機IP和定位

    使用Qt實現(xiàn)獲取本機IP和定位

    這篇文章主要為大家詳細介紹了如何使用Qt實現(xiàn)獲取本機IP和定位,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • C語言中的搜索算法詳細解讀

    C語言中的搜索算法詳細解讀

    這篇文章主要介紹了C語言中的搜索算法詳細解讀,如果用樹構(gòu)建一個搜索樹,層層搜索關(guān)鍵字(的一個字母),搜索到后就是需要的描述,就會節(jié)約很多時間,需要的朋友可以參考下
    2023-10-10
  • C/C++調(diào)用Fortran的DLL的操作過程

    C/C++調(diào)用Fortran的DLL的操作過程

    這篇文章主要介紹了C/C++調(diào)用Fortran的DLL,本文以一個簡單的加法器為例,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03

最新評論

康马县| 扎鲁特旗| 阜南县| 兴海县| 东宁县| 淮南市| 九江县| 东宁县| 新余市| 湛江市| 东乌珠穆沁旗| 商水县| 游戏| 达州市| 隆子县| 民县| 镇沅| 靖宇县| 都兰县| 宣武区| 云林县| 贵南县| 汉阴县| 萝北县| 孝义市| 旬邑县| 汝阳县| 佛坪县| 南华县| 六盘水市| 常宁市| 普格县| 合山市| 合肥市| 连云港市| 邯郸市| 崇左市| 佛山市| 静安区| 谷城县| 东源县|