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

C++ 編譯全流程實(shí)戰(zhàn)示例詳解

 更新時間:2026年06月05日 09:40:09   作者:c++之路  
C++ 編譯的全流程可以分為幾個主要步驟,包括預(yù)處理、編譯、匯編和鏈接,本文完整梳理 C++ 從源代碼到可運(yùn)行程序的四大核心階段:預(yù)處理 → 編譯 → 匯編 → 鏈接,覆蓋原理、指令、細(xì)節(jié)與實(shí)戰(zhàn)示例

本文完整梳理 C++ 從源代碼到可運(yùn)行程序的四大核心階段預(yù)處理 → 編譯 → 匯編 → 鏈接,覆蓋原理、指令、細(xì)節(jié)與實(shí)戰(zhàn)示例,是理解 C++ 程序運(yùn)行機(jī)制的核心筆記。

一、C++ 編譯總覽

一個 .cpp 源文件要變成可執(zhí)行程序,必須經(jīng)過4個標(biāo)準(zhǔn)步驟,缺一不可:

源代碼(.cpp/.h)
    ↓ 【預(yù)處理】預(yù)處理器 cpp
預(yù)處理文件(.ii)
    ↓ 【編譯】編譯器 cc1plus
匯編文件(.s)
    ↓ 【匯編】匯編器 as
目標(biāo)文件(.o/.obj)
    ↓ 【鏈接】鏈接器 ld
可執(zhí)行文件(.out/.exe)

工具鏈:GCC/Clang 會自動調(diào)用上述 4 個工具,我們只需一條編譯命令即可完成全流程。

二、第一步:預(yù)處理(Preprocessing)

2.1 什么是預(yù)處理

預(yù)處理是編譯前的文本替換工作,由預(yù)處理器完成,不檢查語法,只做純文本處理。

2.2 預(yù)處理核心工作

  1. 刪除注釋
    單行注釋 //、多行注釋 /* */ 全部刪除。
  2. 展開頭文件
    #include <xxx> / #include "xxx" 會把頭文件內(nèi)容完整復(fù)制到當(dāng)前文件。
  3. 宏替換
    #define 定義的宏,進(jìn)行文本替換(不做計(jì)算)。
  4. 條件編譯
    根據(jù) #ifdef / #ifndef / #else / #endif 決定保留/刪除代碼。
  5. 添加行號與文件名標(biāo)記
    方便后續(xù)報(bào)錯定位。

2.3 預(yù)處理指令一覽

指令作用
#include插入頭文件內(nèi)容
#define定義宏
#undef取消宏定義
#ifdef / #ifndef判斷宏是否存在
#if / #else / #endif條件編譯
#pragma once防止頭文件重復(fù)包含
#pragma message編譯時打印信息
#error強(qiáng)制報(bào)編譯錯誤

2.4 實(shí)戰(zhàn):生成預(yù)處理文件

使用 GCC/Clang 生成預(yù)處理后的 .ii 文件:

# 只執(zhí)行預(yù)處理,生成 main.ii
g++ -E main.cpp -o main.ii
clang++ -E main.cpp -o main.ii

打開 main.ii 可以看到:

  • 頭文件全部展開
  • 宏全部替換
  • 注釋消失

三、第二步:編譯(Compilation)

3.1 什么是編譯

預(yù)處理文件 → 匯編代碼,是 C++ 最核心階段。

3.2 編譯核心工作

  1. 語法/語義檢查
    報(bào)錯:缺少分號、類型不匹配、函數(shù)未定義等。
  2. 語法分析 → 生成抽象語法樹(AST)
  3. 優(yōu)化代碼
    根據(jù) -O1/-O2/-O3 優(yōu)化執(zhí)行效率、體積。
  4. 生成匯編代碼(.s 文件)
    輸出對應(yīng)平臺匯編指令(人類可讀的底層指令)。

3.3 實(shí)戰(zhàn):生成匯編文件

# 執(zhí)行到編譯階段,生成匯編文件 main.s
g++ -S main.ii -o main.s
# 或直接從源碼一步生成
g++ -S main.cpp -o main.s

main.s 是匯編代碼,包含 mov、add、call 等底層指令。

四、第三步:匯編(Assembly)

4.1 什么是匯編

匯編代碼 → 二進(jìn)制目標(biāo)文件,由匯編器 as 完成。

4.2 核心工作

  • 將匯編指令翻譯成機(jī)器碼(二進(jìn)制)
  • 生成目標(biāo)文件(Linux:.o,Windows:.obj
  • 文件是二進(jìn)制格式,不可直接運(yùn)行(缺少庫函數(shù)地址)

4.3 實(shí)戰(zhàn):生成目標(biāo)文件

# 執(zhí)行到匯編階段,生成 main.o
g++ -c main.s -o main.o
# 直接從源碼生成 .o
g++ -c main.cpp -o main.o

五、第四步:鏈接(Linking)

5.1 什么是鏈接

把多個目標(biāo)文件 + 靜態(tài)庫/動態(tài)庫 → 單個可執(zhí)行文件。

5.2 鏈接核心工作

  1. 合并所有目標(biāo)文件的代碼與數(shù)據(jù)
  2. 地址重定位
    給函數(shù)、變量分配最終內(nèi)存地址
  3. 解析外部符號
    找到 cout、printf、std::string 等標(biāo)準(zhǔn)庫實(shí)現(xiàn)
  4. 生成最終可執(zhí)行文件
    Linux:a.out,Windows:.exe

5.3 靜態(tài)鏈接 vs 動態(tài)鏈接

類型說明優(yōu)點(diǎn)缺點(diǎn)
靜態(tài)鏈接把庫代碼復(fù)制到可執(zhí)行文件不依賴外部文件,可直接運(yùn)行文件體積大,更新庫需重新編譯
動態(tài)鏈接只記錄庫路徑,運(yùn)行時加載文件小,庫可共享更新運(yùn)行必須依賴對應(yīng)庫文件

5.4 實(shí)戰(zhàn):最終鏈接生成可執(zhí)行文件

# 鏈接 .o 文件,生成可執(zhí)行程序 app
g++ main.o -o app
# 直接一鍵完成 4 步
g++ main.cpp -o app

運(yùn)行:

./app   # Linux/macOS
app.exe # Windows

六、完整一鍵編譯四階段指令速查

從源碼直接執(zhí)行每一步:

# 1. 預(yù)處理 → .ii
g++ -E main.cpp -o main.ii
# 2. 編譯 → .s
g++ -S main.cpp -o main.s
# 3. 匯編 → .o
g++ -c main.cpp -o main.o
# 4. 鏈接 → 可執(zhí)行文件
g++ main.o -o app

一鍵全流程:

g++ main.cpp -o app -std=c++17 -O2

七、關(guān)鍵知識點(diǎn)總結(jié)

  1. 預(yù)處理:純文本處理,#include、#define、刪除注釋
  2. 編譯:語法檢查、優(yōu)化、生成匯編代碼
  3. 匯編:匯編 → 二進(jìn)制目標(biāo)文件(.o
  4. 鏈接:合并文件、解析庫、生成可執(zhí)行程序
  5. 目標(biāo)文件不可運(yùn)行:因?yàn)闆]有鏈接外部函數(shù)地址
  6. 頭文件不參與編譯:只在預(yù)處理階段展開,真正編譯的是 .cpp

八、常見編譯錯誤對應(yīng)階段

錯誤發(fā)生階段
頭文件找不到預(yù)處理
宏使用錯誤預(yù)處理
語法錯誤、類型錯誤編譯
函數(shù)未定義實(shí)現(xiàn)鏈接
庫找不到鏈接

總結(jié)

  1. C++ 編譯固定四步:預(yù)處理 → 編譯 → 匯編 → 鏈接
  2. 預(yù)處理負(fù)責(zé)文本替換,編譯負(fù)責(zé)語法與優(yōu)化,鏈接負(fù)責(zé)生成最終程序
  3. 掌握編譯流程,能快速定位頭文件、語法、鏈接類錯誤

到此這篇關(guān)于C++ 編譯全流程總結(jié)的文章就介紹到這了,更多相關(guān)C++ 編譯流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++11 花括號等式初始化器的使用

    C++11 花括號等式初始化器的使用

    花括號等式初始化器是C++11引入的一項(xiàng)強(qiáng)大特性,它為開發(fā)者提供了一種統(tǒng)一、簡潔且安全的方式來初始化對象,本文就來介紹一下花括號等式初始化器的具體使用,感興趣的可以了解一下
    2025-06-06
  • C語言各種操作符透徹理解上篇

    C語言各種操作符透徹理解上篇

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符。讓我們通讀本篇來詳細(xì)了解吧
    2022-02-02
  • 淺析內(nèi)存對齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    淺析內(nèi)存對齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局

    當(dāng)在C中定義了一個結(jié)構(gòu)類型時,它的大小是否等于各字段(field)大小之和?編譯器將如何在內(nèi)存中放置這些字段?ANSI C對結(jié)構(gòu)體的內(nèi)存布局有什么要求?而我們的程序又能否依賴這種布局
    2013-09-09
  • C語言實(shí)現(xiàn)手寫JSON解析的方法詳解

    C語言實(shí)現(xiàn)手寫JSON解析的方法詳解

    JSON(JavaScript?Object?Notation)是一種輕量級的數(shù)據(jù)交換格式,用來傳輸屬性值或者序列性的值組成的數(shù)據(jù)對象。本文將利用C語言實(shí)現(xiàn)手寫JSON解析,感興趣的可以了解一下
    2022-09-09
  • C++ Boost Atomic詳細(xì)講解

    C++ Boost Atomic詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C++常見容器獲取頭元素的方法大全

    C++常見容器獲取頭元素的方法大全

    在C++編程中,容器是存儲和管理數(shù)據(jù)集合的重要工具,不同的容器提供了不同的接口來訪問和操作其中的元素,獲取容器的頭元素(即第一個元素)是常見的操作之一,本文將詳細(xì)列舉C++標(biāo)準(zhǔn)庫中所有常見容器獲取頭元素的方法,并對每種方法進(jìn)行簡要說明,需要的朋友可以參考下
    2025-03-03
  • C++類的分離式寫法介紹示例

    C++類的分離式寫法介紹示例

    今天小編就為大家分享一篇關(guān)于C++類的分離式寫法介紹示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 如何解決C++未定義標(biāo)識符 “string“、未定義標(biāo)識符 “cout“、“name”:未知重寫說明符錯誤

    如何解決C++未定義標(biāo)識符 “string“、未定義標(biāo)識符 “cout“、“name”:未知重寫說明

    在C++編程中,未定義標(biāo)識符"string"、"cout"錯誤多因缺少頭文件引入造成,而"name":未知重寫說明符錯誤則是未正確重寫基類成員函數(shù),解決未定義標(biāo)識符錯誤需正確引入<string>和<iostream>頭文件,對于未知重寫說明符錯誤
    2024-09-09
  • 基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

    基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

    本篇文章是對Sizeof與Strlen的區(qū)別以及聯(lián)系的使用進(jìn)行了詳細(xì)的介紹。需要的朋友參考下
    2013-05-05
  • C++使用string的大數(shù)乘法運(yùn)算(3)

    C++使用string的大數(shù)乘法運(yùn)算(3)

    這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)乘法運(yùn)算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評論

无棣县| 青海省| 玛沁县| 清河县| 富锦市| 彭泽县| 嘉峪关市| 毕节市| 昭平县| 轮台县| 淮南市| 沧源| 洪泽县| 焦作市| 临澧县| 大厂| 荣成市| 宁晋县| 清水县| 八宿县| 驻马店市| 新晃| 高陵县| 喀喇沁旗| 克东县| 白水县| 临高县| 巴林右旗| 景东| 曲阜市| 蒙阴县| 乌兰县| 南充市| 荆州市| 荔浦县| 沛县| 余庆县| 无极县| 德清县| 鄱阳县| 特克斯县|