Linux初始——編譯器gcc

編譯器

  • gcc編譯器
  • 編譯器自舉
  • 動靜態庫
    • 動靜態庫的差異

gcc編譯器

眾所周知,代碼運行的前提是經過四個步驟的

  1. 預處理,其進行宏替換,去注釋,條件編譯,頭文件展開的工作,在gcc的選項中對應gcc -E,其就會生成預處理后的代碼,正常的后綴為i,雖然Linux并不以后綴為識別文件的標準,但存在后綴會更好一些。
  2. 編譯,生成匯編代碼,對應gcc -S,后綴為s
  3. 匯編,生成機器可識別代碼,對應gcc -c,后綴為o,雖然在匯編之后代碼已經成為了二進制代碼,但是仍然無法運行,因為沒有進行連接,即使只有一個源文件也是需要連接的,
  4. 連接,生成可執行文件或庫文件,對應gcc,即不帶選項就會直接生成可執行代碼。

編譯器自舉

眾所周知后,計算機語言發展歷史為

二進制
匯編語言
C語言

首先計算機是二進制的原因是二進制足夠的簡單,歷史上出現過三進制的計算機,但也被拋進了歷史的垃圾堆。
而CPU為什么能夠執行二進制,編寫的二進制代碼其實是一個指令集,而CPU是能夠識別并執行這些指令集的,每一個二進制序列都是一個命令,CPU的解碼單元就是為此而生的。
那么為什么會出現后續的匯編語言再到C語言呢?
原因就是人們很難去理解二進制,所以會出現匯編語言,使得一些指令被翻譯成人類可以識別的語言,比如0111(加法),在匯編中變為了add,0101(移動),在匯編中變為了mov,這樣相比于人們難以理解的二進制代碼變為了一個個文字,使得計算機更加的能貼近人們的生活,也讓程序員能夠更加便捷的去編寫代碼,同樣C語言的誕生也是如此。
但匯編語言在其被發明的時候,計算機為什么能夠執行匯編代碼?難道在匯編語言被發明的時候就出現了匯編的編譯器嗎?并不是,而是在出現匯編語言的時候,先使用二進制去寫一份匯編語言的編譯器,之后在此基礎上,在用匯編語言來寫一份自己的編譯器,此為編譯器自舉。

動靜態庫

在上述我們已經了解到在經過匯編后的二進制代碼是無法被執行的,但為什么二進制代碼無法被執行呢?因為編寫的代碼會套用很多庫文件在這里插入圖片描述
比如圖示中的libc-2.17.so就是C標準庫,如果沒有進行連接將庫與二進制代碼連接起來,那么源代碼中關于庫的相關代碼就無法運行。

像代碼在連接過程去自己尋找標準庫連接的就是動態庫,如果我們將標準庫復制到源代碼中,此時不在經過連接就可以直接運行,這種就是靜態庫,但與此同時,可執行程序的體積將會擴大。當然靜態庫并不是直接將庫給拷貝到源文件中,而是在編譯時選擇 -static選項,是強制要求編譯器采用靜態連接的方式進行編譯。

動靜態庫的差異

如上述所說,采用動靜態庫的第一個差異就是可執行文件的體積差異,但如果庫丟失或損壞,那么經過動態連接的程序是無法執行的,但如果是靜態連接,是不受影響的,當然編譯器默認都是采用動態連接動態庫的,這種更高效一些。

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

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

相關文章

Three.js + AI預測:在數字孿生中實現數據可視化智能決策

某智慧工廠的數字孿生系統曾陷入尷尬:3D 模型里的生產線數據實時跳動,卻沒人能預判 “2 小時后哪臺機器會停機”。這就像有了高清監控,卻不會分析監控畫面 ——Three.js 做出的可視化是 “眼睛”,AI 預測才是 “大腦”。不少團隊用…

刀客doc:亞馬遜持續猛攻程序化廣告

文/刀客doc(頭條深一度精選作者)一7月的尾聲和8月的開端,廣告市場見證了兩場截然不同的場面。7月31日,亞馬遜公布了截至6月30日的2025年第二季度財報。廣告業務表現尤為亮眼:單季收入達到157億美元,同比增長約22%,成為…

政府網站IPv6檢測怎么做?檢測指標有哪些?

隨著信息技術的飛速發展,IPv6作為下一代互聯網的核心協議,已成為全球互聯網發展的必然趨勢。我國政府高度重視IPv6的規模部署和應用推廣,明確要求各級政府網站必須完成IPv6改造,以提升網絡基礎設施的現代化水平,增強網…

有N個控制點的三次B樣條曲線轉化為多段三階Bezier曲線的方法

將具有N 個控制點的三次B樣條曲線轉換為多段三階Bezier曲線,是計算機圖形學和CAD系統中常見的操作。這種轉換基于B樣條曲線的局部性質以及其與Bezier曲線之間的關系。基本原理三次B樣條曲線由一組控制點 P?, P?, ..., P??? 和一個節點向量 U {u?, u?, ..., …

chrome好用的瀏覽器插件

https://ad.infread.com/?utm_sourcebaidu_sem&utm_mediumweb_pc&utm_campaignkeywords_website_translate&bd_vid2831968530895394443 目前我自己覺得比較用的谷歌瀏覽器翻譯插件->沉浸式翻譯 個人覺得無論時速度還是準確度都是比較好的

k8s---prometheus 監控

目錄 環境準備 下載 kube-prometheus 軟件包 下載prometheus 鏡像 master節點 master節點導入prometheus軟件包 解壓 node節點 node節點導入鏡像 解壓 從tar包中加載鏡像 部署 prometheus 修改映射端口 提交 查看pod pod和svc正常啟動 deployment daemonset se…

華大時空組學空轉圖像處理

華大時空組學空轉圖像處理 library(png) library(tiff) st <- readRDS(01.Stereo-seq/output_all/Demo_Mouse_Kidney/outs/feature_expression/seurat_out.rds) dim(stassays$Spatialcounts) stassays$Spatialcounts[1:4,1:4] coord.df <- data.frame(imagerow st$x, im…

如何在SptingBoot項目中引入swagger生成API文檔

目錄 背景介紹&#xff0c;swagger的必要性 swagger的引入&#xff1a; 1.首先我們需要在 pom.xml文件中導入jar包 2.給swagger創建一個配置類&#xff1a; 3.為實體類添加注解 4.為controller添加注解 背景介紹&#xff0c;swagger的必要性 自從在2005年前端工程師誕生之…

GD32入門到實戰21--輸入捕獲

我們新建capture_drv.c#include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_10MHZ,GPIO…

MyBatis 與 MyBatis-Plus 的對比與選擇

&#x1f50d; MyBatis 與 MyBatis-Plus 的對比與選擇 文章目錄&#x1f50d; MyBatis 與 MyBatis-Plus 的對比與選擇&#x1f9e0; 一、MyBatis 核心回顧&#x1f4a1; 核心思想與架構定位? 基礎使用示例?? MyBatis 的痛點? 二、MyBatis-Plus 功能特性解析&#x1f4a1; M…

大數據-湖倉一體

數據倉庫 這是一個傳統的概念了&#xff0c;趨向于結構化數據&#xff0c;簡單來說就是進過數據治理后的標準數據更易于數據分析使用&#xff0c;代價就是存儲比較昂貴了 數據湖 近些年來新出的一種概念&#xff0c;就是存儲了結構化&#xff0c;非結構化&#xff0c;半結構…

Java視覺跟蹤入門:使用OpenCV實現實時對象追蹤

視覺跟蹤是計算機視覺領域的一個重要分支&#xff0c;它允許我們在視頻序列中持續定位移動對象。本文將介紹如何使用Java和OpenCV庫來實現一個簡單的視覺跟蹤系統。什么是視覺跟蹤&#xff1f;視覺跟蹤是指通過分析視頻幀來自動追蹤一個或多個移動對象的過程。這項技術廣泛應用…

【題解 | 兩種做法】洛谷 P4208 [JSOI2008] 最小生成樹計數 [矩陣樹/枚舉]

特別難調&#xff0c;洛谷題解區很多人代碼可讀性不強&#xff0c;做的我懷疑人生。 &#xff08;雖然我的碼風也一般就是了&#xff09; 前置知識&#xff1a; Kruskal 求最小生成樹。 題面&#xff1a; 洛谷 P4208 兩種做法&#xff0c;一種矩陣樹一種枚舉。 &#xff08…

光譜相機多層鍍膜技術如何提高透過率

光譜相機多層鍍膜技術通過精密的光學設計與材料組合實現透過率提升&#xff0c;其核心原理與技術特性如下&#xff1a;一、多層鍍膜的光學優化機制?復合相位調控? 通過交替沉積高折射率&#xff08;如TiO?, n2.3&#xff09;與低折射率材料&#xff08;如SiO?, n1.46&#…

ubantu安裝配置hive

在Ubuntu系統上安裝Hive通常涉及幾個步驟&#xff0c;包括安裝Java&#xff08;因為Hive依賴于Java&#xff09;&#xff0c;安裝Hadoop&#xff0c;然后安裝Hive本身。以下是一個基本的步驟指南&#xff1a; 安裝Java 首先&#xff0c;確保你的系統上安裝了Java。你可以通過運…

大模型RAG項目實戰:文本向量模型>Embedding模型、Reranker模型以及ColBERT模型

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

基于uni-app的校園綜合服務平臺開發實戰

閃遞校園&#xff1a;基于uni-app的校園綜合服務平臺開發實戰作為一名全棧開發者&#xff0c;我用6個月時間開發了這款校園綜合服務平臺——閃遞校園。本文將詳細分享項目從0到1的開發經驗&#xff0c;包括技術選型、核心功能實現、踩坑記錄以及性能優化等方面的干貨內容。&…

Qt::Q_INIT_RESOURCE用法

q_init_resource 用法 q_init_resource 是 Qt 框架中用于初始化嵌入式資源的一個函數。它通常用于將編譯到應用程序二進制文件中的資源&#xff08;如圖像、QML文件、翻譯文件等&#xff09;注冊到Qt的資源系統中。 基本用法 cpp Q_INIT_RESOURCE(resourcename); 其中 resource…

【開題答辯全過程】以 基于php的校園兼職求職網站為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

安卓懸浮球-3566-測試報告

安卓懸浮球-3566-測試報告 測試概述 項目名稱: 懸浮球電子秤應用 測試版本: v1.0.0 測試時間: 2025年9月 測試環境: UniApp開發環境 測試類型: 功能測試、性能測試、兼容性測試 測試結果: 見附件測試環境配置 硬件環境 測試設備: Android 內置3566屏幕分辨率: 1080x1920內存: 2…