【C語言】鏈接與編譯(編譯環境 )

前言:

在前面講解文件操作,了解了文件的類別,文件的打開與關閉,字符讀寫函數,?字符串讀寫函數,格式化輸入輸出函數

在C語言編程中,編譯與鏈接是將源代碼轉化為可執行程序的關鍵步驟。為了詳細講解這些過程及其相關知識點,我們將從以下幾個方面展開,并結合實例進行說明:

環境

對C語言而言,生成程序的過程中存在兩種環境:翻譯環境?與?運行環境

  • 翻譯環境:負責將C語言源代碼轉化為機器指令。這一過程包括預處理、編譯、匯編和鏈接四個階段。
  • 執行環境:運行編譯后生成的可執行程序,通常依賴于操作系統和硬件資源

翻譯環境

在翻譯環境中,源代碼會被轉化為可執行的機器指令。這個過程會分為編譯鏈接兩大步。

?其中,編譯分為:預處理,編譯,匯編三個小步驟。而鏈接則是將多個.c文件與鏈接庫進行鏈接,從而生成可執行程序。鏈接庫,可以簡單理解為庫函數存儲的地方,比如printf就需要鏈接到外部的庫函數。

C程序編譯過程與ELF可執行文件及gcc常見編譯選項_c lion怎么編程elf文件-CSDN博客

編譯

編譯分為:預處理編譯匯編三小步,接下來我們看看每一個階段都什么作用。。

預處理

預處理階段主要處理源代碼中的預處理指令,如宏定義、文件包含和條件編譯等。例如:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

在預處理階段,MAX宏會被展開為相應的表達式。?

在預處理階段,源?件.c和頭文件.h會被處理成為.i為后綴的?件?

在預處理階段,MAX宏會被展開為相應的表達式。

示例
假設代碼包含以下內容:
#include <stdio.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {int x = 10, y = 20;printf("Max value is: %d\n", MAX(x, y));return 0;
}

經過預處理后,MAX宏被展開為:

int main() {int x = 10, y = 20;printf("Max value is: %d\n", ((x) > (y) ? (x) : (y)));return 0;
}

Linux 高級編程 - 必備的 gcc 基礎 登龍(DLonng)

預處理階段會發生以下操作:

  1. 將頭文件展開
  2. 刪除#define指令,并執行宏的替換
  3. 刪除注釋代碼

編譯

在編譯階段,.i會被處理成為.s為后綴的?件

  • 詞法分析:將源代碼字符串分解成一系列的單詞或符號(Token),如關鍵字、標識符、字面量、操作符等。
  • 語法分析:根據語言的語法規則,將Token串轉換成一個體現語法規則的樹狀數據結構,即抽象語法樹(AST)。這一步驗證了源代碼是否符合語言的語法規則。
  • 語義分析:在語法分析的基礎上,進一步理解代碼的含義,如變量類型、表達式求值等,并建立符號表以存儲變量的作用域、類型等信息。
  • 中間代碼生成:將AST轉換為一種中間表示形式(IR),以便于后續的優化和跨平臺執行。
  • 代碼優化:對中間代碼進行優化,以提高程序的運行效率。優化可能包括刪除無用的代碼、循環優化、常量折疊等。
  • 目標代碼生成:將優化后的中間代碼轉換為匯編代碼。這一步生成了特定于機器的代碼,但尚未轉換為機器語言指令。

以以下代碼為例:

編譯階段將預處理后的代碼轉換為匯編語言,并進行語法分析、語義分析和優化。例如:

int add(int a, int b) 
{return a + b;
}

編譯器會生成對應的匯編代碼,如:

add:push ebpmov ebp, espmov eax, [ebp+8]add eax, [ebp+12]pop ebpret

示例
假設代碼包含以下內容:

int square(int x) 
{return x * x;
}

編譯后生成的匯編代碼可能如下:

square:push ebpmov ebp, espmov eax, [ebp+8]imul eax, eaxpop ebpret

C語言 — 必學的編程基礎語法,入門就從這里開始!_編程語法_C語言編程俱樂部的博 …

匯編

匯編階段將匯編代碼轉換為機器語言目標文件(如.o文件)。例如:

section .text
global _start_start:mov eax, 1xor ebx, ebxint 0x80

匯編器會生成對應的機器碼。

示例
假設代碼包含以下內容:

section .text
global _start_start:mov eax, 1xor ebx, ebxint 0x80

匯編器生成的目標文件可能如下:

00000000 <_start>:0:   b8 01 00 00 00          mov    $0x1,%eax5:   31 db                 xor    %ebx,%ebx7:   cd 80                 int    $0x80

程序編譯工具基礎 - 知乎

鏈接

鏈接是?個復雜的過程,鏈接的時候需要把?堆?件鏈接在?起才?成可執?程序。
鏈接過程主要包括:地址和空間分配,符號決議和重定位等這些步驟。
鏈接解決的是

例如:

// file1.c
int add(int a, int b) {return a + b;
}

?個項?中多?件、多模塊之間互相調?的問題

int main() {int result = add(5, 3);printf("Result: %d\n", result);return 0;
}

兩個文件分別編譯生成目標文件file1.ofile2.o,然后通過鏈接器將它們鏈接成可執行文件。

?

鏈接的大致過程就是:

先給外部變量一個假的地址,然后再在鏈接的時候,將所有假地址修正。

我們下章再見吧!!!!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81424.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java視頻流RTMP/RTSP協議解析與實戰代碼

在Java中實現視頻直播的輸入流處理&#xff0c;通常需要結合網絡編程、多媒體處理庫以及流媒體協議&#xff08;如RTMP、HLS、RTSP等&#xff09;。以下是實現視頻直播輸入流的關鍵步驟和技術要點&#xff1a; 1. 視頻直播輸入流的核心組件 網絡輸入流&#xff1a;通過Socket或…

系分論文《論系統需求分析方法及應用》

系統分析師論文范文系列 【摘要】 2022年6月&#xff0c;我作為系統分析師參與了某金融機構“智能信貸風控系統”的建設項目。該系統旨在通過對業務流程的數字化重構&#xff0c;優化信貸審批效率并降低風險。項目涉及信貸申請、資質審核、風險評估、額度審批等核心流程&#x…

stack和queue簡單模擬實現

stackreverse_iteratorqueuepriority_queue仿函數具體代碼 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…

Linux內核可配置的參數

sysctl -a 命令會列出當前Linux內核所有可配置的參數及其當前值。這些參數允許你在系統運行時動態地調整內核的行為&#xff0c;而無需重新編譯內核或重啟系統。 內容非常多&#xff0c;因為內核有很多可調的方面。我們可以把它們大致分為幾個主要類別&#xff1a; kernel.*: …

【背包dp-----分組背包】------(標準的分組背包【可以不裝滿的 最大價值】)

通天之分組背包 題目鏈接 題目描述 自 01 01 01 背包問世之后&#xff0c;小 A 對此深感興趣。一天&#xff0c;小 A 去遠游&#xff0c;卻發現他的背包不同于 01 01 01 背包&#xff0c;他的物品大致可分為 k k k 組&#xff0c;每組中的物品相互沖突&#xff0c;現在&a…

操作系統:os概述

操作系統&#xff1a;OS概述 程序、進程與線程無極二級目錄三級目錄 程序、進程與線程 指令執行需要那些條件&#xff1f;CPU內存 需要數據和 無極 二級目錄 三級目錄

RAG文本分塊

不論是向量化模型還是大語言模型&#xff0c;都存在輸入長度的限制。對于超過限制的文本&#xff0c;模型會進行截斷&#xff0c;造成語義缺失。分塊可以確保每個文本片段都在模型的處理范圍內&#xff0c;避免重要信息的丟失。 文本分塊的核心原則 高質量分塊的核心原則是&a…

2025 年九江市第二十三屆中職學校技能大賽 (網絡安全)賽項競賽樣題

2025 年九江市第二十三屆中職學校技能大賽 &#xff08;網絡安全&#xff09;賽項競賽樣題 &#xff08;二&#xff09;A 模塊基礎設施設置/安全加固&#xff08;200 分&#xff09;A-1 任務一登錄安全加固&#xff08;Windows,Linux&#xff09;A-2 任務二 Nginx 安全策略&…

量子隧穿:PROFINET到Ethernet ip的無損耗協議轉換方案轉

在本季度的生產工作中&#xff0c;我們成功實現了倉儲物流自動化分揀系統中的關鍵技術突破。我們面臨的主要挑戰是將采用EtherNet/IP協議的輸送帶控制器與PROFINET協議的上位系統進行有效通信。通過引入ethernet IP轉PROFINET網關倍訊科技BX-606-EIP&#xff0c;我們實現了輸送…

OpenCV CUDA模塊中矩陣操作------降維操作

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::reduce 函數用于對 GPU 上的矩陣沿某個維度進行降維操作&#xff0c;例如求和、取最大值等。此函數支持多種降維操作&#xff0c;并允…

一分鐘用 MCP 上線一個 貪吃蛇 小游戲(CodeBuddy版)

我正在參加CodeBuddy「首席試玩官」內容創作大賽&#xff0c;本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 你好&#xff0c;我是悟空。 背景 上篇我們用 MCP 上線了一個 2048 小游戲&#xff0c;這次我們繼續做一個 …

簡單神經網絡(ANN)實現:從零開始構建第一個模型

本文將手把手帶你用 Python Numpy 實現一個最基礎的人工神經網絡&#xff08;Artificial Neural Network, ANN&#xff09;。不依賴任何深度學習框架&#xff0c;適合入門理解神經網絡的本質。 一、項目目標 構建一個三層神經網絡&#xff08;輸入層、隱藏層、輸出層&#xf…

使用python進行人員軌跡跟蹤

一、系統概述 該系統基于計算機視覺技術&#xff0c;實現對視頻或攝像頭畫面中的人員進行檢測、跟蹤&#xff0c;并生成軌跡數據。支持透視變換校準&#xff08;鳥瞰圖顯示&#xff09;、多目標跟蹤、軌跡存儲及視頻錄制功能&#xff0c;適用于安防監控、行為分析等場景。 二…

[強化學習的數學原理—趙世鈺老師]學習筆記02-貝爾曼方程

本人為強化學習小白&#xff0c;為了在后續科研的過程中能夠較好的結合強化學習來做相關研究&#xff0c;特意買了西湖大學趙世鈺老師撰寫的《強化學習數學原理》中文版這本書&#xff0c;并結合趙老師的講解視頻來學習和更深刻的理解強化學習相關概念&#xff0c;知識和算法技…

Docker入門指南:鏡像、容器與倉庫的核心概念解析

目錄 前言&#xff1a;為什么需要Docker&#xff1f; 一、Docker能做什么&#xff1f; 二、核心概念解析 1. 鏡像&#xff08;Image&#xff09;&#xff1a;應用的標準化打包 2. 容器&#xff08;Container&#xff09;&#xff1a;鏡像的運行實例 3. 鏡像倉庫&#xff0…

大模型微調實戰:基于GpuGeek平臺的低成本高效訓練方案

文章目錄 引言一、GpuGeek平臺使用入門1. 注冊與賬號設置2. 控制臺功能概覽3. 快速創建GPU實例3. 預置鏡像與自定義環境 二、GpuGeek平臺核心優勢解析1. 顯卡資源充足&#xff1a;多卡并行加速訓練2. 鏡像超多&#xff1a;開箱即用的開發環境3. 計費靈活&#xff1a;按需付費降…

Linux:計算機的層狀結構

1.馮諾依曼體系結構 我們常見的計算機&#xff0c;如筆記本、臺式機。我們不常見的計算機&#xff0c;如服務器&#xff0c;大部分都遵守馮諾依曼體系結構。 CPU&#xff1a;運算器和控制器組成。運算器主要工作是做算術運算和邏輯運算。控制器主要工作是協調設備之間信息流動的…

LangGraph(四)——加入人機交互控制

目錄 1. 引言2. 添加Human Assistance工具3. 編譯狀態圖4. 提示聊天機器人5. 恢復執行參考 1. 引言 智能體可能不可靠&#xff0c;甚至需要人工輸入才能完成任務。同樣&#xff0c;對于某些操作&#xff0c;你可能需要在運行前獲得人工批準&#xff0c;以保證一切按預期運行。 …

數據結構【AVL樹】

AVL樹 1.AVL樹1.AVL的概念2.平衡因子 2.AVl樹的實現2.1AVL樹的結構2.2AVL樹的插入2.3 旋轉2.3.1 旋轉的原則 1.AVL樹 1.AVL的概念 AVL樹可以是一個空樹。 它的左右子樹都是AVL樹&#xff0c;且左右子樹的高度差的絕對值不超過1。AVL樹是一顆高度平衡搜索二叉樹&#xff0c;通…

JavaScript【5】DOM模型

1.概述&#xff1a; DOM (Document Object Model)&#xff1a;當頁面被加載時&#xff0c;瀏覽器會創建頁面的文檔對象模型&#xff0c;即dom對象&#xff1b;dom對象會被結構化為對象樹&#xff0c;如一個HTML文檔會被分為head&#xff0c;body等部分&#xff0c;而每個部分又…