C++中的編譯與鏈接
?前言:
C++有個最大的特點,那便是編譯型語言,相比于Python這種解釋型語言,C++在編譯階段就進(jìn)行了許多處理,在執(zhí)行階段便具有高效性,本篇主要講解C++中的編譯與鏈接;
一、編譯與鏈接模型
1、一開始的C++是一個簡單的加工模型,如下圖所示:

這樣會存在一些問題:
- 無法處理大型程序
- 加工耗時較長
- 即使少量修改,也需要全部重新加工
2、為了解決以上問題,引入了分塊處理的方式:

編譯鏈接模型的好處:
- 編譯耗資源但一次處理輸入較少
- 鏈接輸入較多但處理速度快
- 便于程序修改(只需修改一部分)
在引入分塊處理后,出現(xiàn)了一些常見概念:
①定義與聲明:一個變量在只需在一個文件中定義,其他文件可通過聲明該變量;
②頭文件與源文件:由于聲明的變量、函數(shù)過多,可將聲明放在頭文件中,在源文件中引用頭文件加載這些聲明;
③翻譯單元:源文件 + 相關(guān)頭文件(直接/間接)- 應(yīng)忽略的預(yù)處理語句(宏定義不符合條件的);
二、編譯與鏈接流程
下面通過一個實際例子,講解程序如何從cpp一步步到可執(zhí)行文件的;
下圖為一個整體流程圖:

1、預(yù)處理階段:將cpp或c的源程序進(jìn)行處理(頭文件展開等),轉(zhuǎn)換成以i結(jié)尾的翻譯單元文件
g++ -E ./main.cpp -o ./main.i
2、編譯階段:生成編譯后以s為后綴的匯編代碼文件
g++ main.i -S -o main.s
3、匯編階段:將匯編代碼進(jìn)行匯編生成以o為后綴目標(biāo)文件
4、鏈接階段:合并多個目標(biāo)文件,關(guān)聯(lián)聲明與定義,生成可執(zhí)行程序
以上為系統(tǒng)內(nèi)部具體的實現(xiàn)操作,我們在實際運行中可以通過一行命令實現(xiàn)編譯鏈接:
g++ ./main.cpp -o ./main
注意點:在用IDE編譯程序時,往往會有兩種模式:Debug和Release,Debug在開發(fā)中使用,優(yōu)化較少,Release在最終程序編譯使用,優(yōu)化較多;
三、總結(jié)
- C++的編譯與鏈接過程是復(fù)雜的,預(yù)處理、編譯與鏈接都可能出錯,要細(xì)心排除;
- 編譯可能產(chǎn)生警告、錯誤,都要重視;
- 我個人的感受,會遇到一些很奇怪的坑,不管從環(huán)境還是依賴庫,這就需要有耐心不斷嘗試,并且總結(jié)經(jīng)驗;
到此這篇關(guān)于C++中的編譯與鏈接的文章就介紹到這了,更多相關(guān)C++ 編譯與鏈接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++使用CriticalSection實現(xiàn)線程同步實例
這篇文章主要介紹了C++使用CriticalSection實現(xiàn)線程同步實例,是使用CriticalSection對前文實例的擴展,具有一定的參考借鑒價值,需要的朋友可以參考下2014-10-10
VScode搭建OpenCV環(huán)境的詳細(xì)步驟
用vscode來寫opencv代碼需要自己編譯OpenCV,主要用到MinGW-w64和CMake工具。接下來通過本文給大家介紹VScode搭建OpenCV環(huán)境的相關(guān)知識,需要的朋友可以參考下2021-11-11
Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解
遺傳算法起源于對生物系統(tǒng)所進(jìn)行的計算機模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過程中自動獲取和積累有關(guān)搜索空間的知識,并自適應(yīng)地控制搜索過程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問題,需要的可以參考一下2022-09-09
C++數(shù)據(jù)結(jié)構(gòu)之單鏈表
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個個結(jié)點鏈結(jié)成的。結(jié)點包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲數(shù)據(jù)元素的信息,指針域用來存儲下一個結(jié)點的地址,更詳細(xì)內(nèi)容請需要的小伙伴參考下面文章內(nèi)容2022-01-01
C++實現(xiàn)神經(jīng)網(wǎng)絡(luò)框架SimpleNN的詳細(xì)過程
本來自己想到用C++實現(xiàn)神經(jīng)網(wǎng)絡(luò)主要是想強化一下編碼能力并入門深度學(xué)習(xí),對C++實現(xiàn)神經(jīng)網(wǎng)絡(luò)框架SimpleNN的詳細(xì)過程感興趣的朋友一起看看吧2021-08-08

