1. 程式人生 > >編譯的整個過程:預編譯、編譯、彙編、連結

編譯的整個過程:預編譯、編譯、彙編、連結

編譯分為四個步驟:
每個步驟將檔案編譯成別的格式,如下:

步驟 未編譯 預編譯 編譯 彙編 連結
檔案 fun.h、fun.cpp、test.cpp fun.i、test.i fun.s、test.s fun.o、test.o projectname.exe

詳解
1.預編譯

預編譯過程主要做4件事:
①展開標頭檔案
在寫有#include <filename>#include "filename"的檔案中,將檔案filename展開,通俗來說就是將fiename檔案中的程式碼寫入到當前檔案中;
②巨集替換


③去掉註釋
④條件編譯
即對#ifndef #define #endif進行判斷檢查,也正是在這一步,#ifndef #define #endif的作用體現出來,即防止標頭檔案被多次重複引用

2.編譯

將程式碼轉成彙編程式碼,並且在這個步驟中做了兩件很重要的工作:
編譯器在每個檔案中儲存一個函式地址符表,該表中儲存著當前檔案內包含的各個函式的地址
②因為這步要生成彙編程式碼,即一條一條的指令,而呼叫函式的程式碼會被編譯成一條call指令,call指令後面跟的是jmp指令的彙編程式碼地址,而jmp指令後面跟的才是“被呼叫的函式編譯成彙編程式碼後的第一條指令”的地址

,但是給call指令後面補充上地址的工作是在連結的時候做的事情。

3.彙編

將彙編程式碼轉成機器碼

4.連結

編譯器將生產的多個.o檔案連結到一起生成一個可執行.exe檔案;
但是在這個過程中,編譯器做的一個重要的事情是將每個檔案中call指令後面的地址補充上;方式是從當前檔案的函式地址符表中開始找,如果沒有,繼續向別的檔案的函式地址符表中找,找到後填補在call指令後面,如果找不到,則連結失敗。

相關推薦

編譯整個過程編譯編譯彙編連結

編譯分為四個步驟: 每個步驟將檔案編譯成別的格式,如下: 步驟 未編譯 預編譯 編譯 彙編 連結 檔案 fun.h、fun.cpp、test.cpp

編譯過程編譯編譯彙編連結

原文地址:http://blog.csdn.net/u014120684/article/details/46352167 預編譯的副檔名是ii  gcc -E hello.c -o hello.i  預編譯過程主要處理原始碼檔案當中的以#開頭的預編譯指令,比如#in

程式的生成過程處理,編譯彙編連結

當我們使用VS或者其他編譯器對我們所寫的程式進行執行時,在下面會出現,編譯、連結等等顯示,那麼到底什麼是編譯,連結?我們所寫的程式碼到底是怎樣變成可執行程式的?接下來就為大家解釋,程式是如何產生的。 示例一個大家都見過的程式列印:hello world!(檔名

VS2013 C#呼叫EXCEL 編譯報錯找不到編譯動態表示式所需的一個或多個型別。是否缺少引用?

背景:客戶提出需求希望把獲取的結果匯出成excel表格,本人曾經自制過一個excel操作類(不甚完整但是夠用),找到原有專案將操作類匯入至新專案後,編譯開始報錯:“找不到編譯動態表示式所需的一種或多種型別。是否缺少引用?”如下圖所示按照網路上的方法將Microsoft.Off

Qt入門之基礎篇 ( 二 ) Qt項目建立編譯運行和發布過程解析

qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解:   本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。   本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知

GCC編譯器原理(三)------編譯原理三編譯過程---處理

ddl str dep 數據 路徑 back char 構造 data Gcc的編譯流程分為了四個步驟: 預處理,生成預編譯文件(.文件):gcc –E hello.c –o hello.i 編譯,生成匯編代碼(.s文件):gcc –S hello.i –o hell

編譯處理指令檔案包含指令巨集定義指令條件編譯指令

編譯預處理指令:檔案包含指令、巨集定義指令、條件編譯指令。“#”開頭,不加分號“;” 1、檔案包含指令:  #include<檔名> 標準目錄下搜尋  #include"檔名" 當前目錄下搜尋,再在標準目錄下搜尋 2、巨集定義指令:  #define 巨集名 巨集文字 //巨集名習慣大寫  #

Linux基礎編譯編譯彙編連結

四:預編譯、編譯、彙編、連結 //詳情參考《程式設計師的自我修養》1-6章 //在原文基礎上做補充和修改 原文:https://blog.csdn.net/weixin_40740059/article/details/84075653 如圖:c程式的4G虛擬地址空間劃分: 

【死磕JVM】——-2Java程式碼編譯和執行的整個過程

Java程式碼編譯是由Java原始碼編譯器來完成的,流程圖如下: Java位元組碼的執行是由JVM執行引擎來完成的,流程圖如下: Java程式碼編譯和執行的整個過程包含以下三個重要機制: 1.Java程式碼編譯機制。 2.類載入機制。 3.類執行機制。 Java原始碼編

[原創]Nexus5 源碼下載編譯真機燒錄過程記錄

慢慢 prop sha shell 腳本 .cn 等待 strong download dos asop使用清華鏡像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一開始使用每月初始化包的方式因為無法搞定版本的問題,沒能通過編

java --代碼編譯和執行的整個過程

pan home 面向 share 簡單的 下一條 c++ oot 註解 1. 什麽是 JVM   JVM 是 Java 的核心和基礎,在 Java 編譯器和 os 平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行

typeof搖樹優化js編譯

顯示 obj 表達 string defined 原始的 刪除 執行 undefined typeof:    typeof用以獲取一個變量或者表達式的類型,一元運算符 null:空、無。表示不存在,當為對象的屬性賦值為null,表示刪除該屬性 undefined

Python編譯解釋動態庫靜態庫編譯過程頭文件了解一下

ack 第三方庫 轉換 ado 學習 執行 article 共享 CP 學習Python這門語言首先要了解 什麽是編譯與解釋,什麽是連接,什麽是動態庫與靜態庫, 什麽是編譯: 編譯就是先把高級語言設計的程序翻譯成二進制的機器語言,然後CPU直接執行機器碼就可以了。一把翻

u-boot的啟動編譯過程和命令添加

U-BOOTu-boot的啟動、編譯過程和命令添加MCU:s5pv210開發板:unsp210u-boot:1.3.4一、簡介U-Boot是一種支持多架構,多操作系統的Bootloader(啟動引導程序)u-boot目前最新版本是:http://ftp.denx.de/pub/u-boot/二、啟動過程嵌入式

GCC編譯器原理(三)------編譯原理三編譯過程(2-2)---編譯之語法分析

tails 需要 表達式 一個數 就是 out 和數 margin 操作符 2.2 語法分析 語法分析器(Grammar Parser)將對由掃描器產生的記號進行語法分析,從而產生語法樹(Syntax Tree)。整個分析過程采用了上下文無關語法(Context-free

JVM原理(Java代碼編譯和執行的整個過程+JVM內存管理及垃圾回收機制)

變化 並行 colspan 同時 簡單的 table 目前 動態 中心 轉載註明出處: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特點主要是指操作系統裝入JVM是通過jdk中Java.ex

Java 程式碼編譯和執行的整個過程

Java 位元組碼的執行是由 JVM 執行引擎來完成,流程圖如下所示: Java 程式碼編譯和執行的整個過程包含了以下三個重要的機制: Java 原始碼編譯機制 類載入機制 類執行機制 Java 原始碼編譯機制 Java 原始碼編譯由以下三個過程組成: 分析和輸入到符

JavaScript學習筆記——函式立即執行函式作用域編譯—day two

目錄 函式 定義 組成形式 遞迴 立即執行函式 作用域 變數作用域 函式作用域[[scope]] 作用域鏈 預編譯 JS執行分三步: 預編譯執行分五步: 函式 原則:高內聚弱耦合(重複) 定義    

Oracle 編譯儲存過程報錯 表或檢視不存在問題分析與解決

今天遇到一個問題,自己寫了一個很簡單的儲存過程,編譯的時候,報錯: 表或檢視不存在;      但是:表確實是存在,單獨拿出來查詢,一點問題也沒有。      經過幾番查詢,找到了問題所在: 查詢表的許可權不夠; 解決方案:

Linux GCC生成可執行程式的4個步驟——處理編譯彙編連結

一,預編譯 操作步驟:gcc -E hello.c -o hello.i 主要作用: 處理關於 “#” 的指令 【1】刪除#define,展開所有巨集定義。例#define portnumber 3333 【2】處理條件預編譯 #if, #ifdef, #if, #elif,#e