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

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

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

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

一、C++ 編譯總覽

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

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

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

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

2.1 什么是預(yù)處理

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

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

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

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

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

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

打開(kāi) main.ii 可以看到:

  • 頭文件全部展開(kāi)
  • 宏全部替換
  • 注釋消失

三、第二步:編譯(Compilation)

3.1 什么是編譯

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

3.2 編譯核心工作

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

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

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

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

四、第三步:匯編(Assembly)

4.1 什么是匯編

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

4.2 核心工作

  • 將匯編指令翻譯成機(jī)器碼(二進(jìn)制)
  • 生成目標(biāo)文件(Linux:.o,Windows:.obj
  • 文件是二進(jìn)制格式,不可直接運(yùn)行(缺少庫(kù)函數(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 什么是鏈接

把多個(gè)目標(biāo)文件 + 靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù) → 單個(gè)可執(zhí)行文件

5.2 鏈接核心工作

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

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

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

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)鍵知識(shí)點(diǎn)總結(jié)

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

八、常見(jiàn)編譯錯(cuò)誤對(duì)應(yīng)階段

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

總結(jié)

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

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

相關(guān)文章

  • C++11 花括號(hào)等式初始化器的使用

    C++11 花括號(hào)等式初始化器的使用

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

    C語(yǔ)言各種操作符透徹理解上篇

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

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

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

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

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

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

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

    C++常見(jiàn)容器獲取頭元素的方法大全

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

    C++類(lèi)的分離式寫(xiě)法介紹示例

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

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

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

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

    本篇文章是對(duì)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)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評(píng)論

宁都县| 五寨县| 沙坪坝区| 邳州市| 通州市| 吉林省| 沅江市| 长沙市| 海阳市| 汝城县| 二连浩特市| 法库县| 孟村| 牟定县| 东安县| 苍南县| 苗栗县| 长沙市| 卓尼县| 新宁县| 夏河县| 莱芜市| 宝鸡市| 宜章县| 海晏县| 化德县| 建始县| 雷波县| 吐鲁番市| 莱西市| 曲松县| 建瓯市| 雷波县| 横山县| 太仆寺旗| 平舆县| 中方县| 江永县| 平果县| 玉门市| 介休市|