Linux編譯器---gcc/g++使用詳解

目錄

前言

?gcc/g++介紹

gcc/g++的編譯指令(以gcc為例)

?編輯?gcc選項

預處理(進行宏替換)

?編譯(生成匯編)

匯編(生成機器可識別代碼)

?鏈接(生成可執行文件或庫文件)

?函數庫

概念

?動態庫和靜態庫



?

?前言

編譯器的處理過程:

  1. 預處理(進行宏替換)
  2. 編譯(生成匯編)
  3. 匯編(生成機器可識別代碼)
  4. 鏈接(生成可執行文件或庫文件)
    ?

更加詳細的介紹,可以參照這篇博客:C語言翻譯環境:預編譯+編譯+匯編+鏈接詳解-CSDN博客

??gcc/g++介紹

GCC(GNU Compiler Collection)是一個由GNU項目開發的編譯器套件,它包括了用于多種編程語言的編譯器,如C、C++、Fortran、Ada、Go等。GCC是一個開源的工具集,可在多個平臺上運行,支持多種操作系統和架構。它是許多操作系統的默認編譯器,也是許多開源項目的首選編譯工具。

在GCC中,gcc和g++分別是用于編譯C和C++代碼的編譯器。

  1. gcc:

    • 功能gcc是GCC套件中用于編譯C語言代碼的編譯器。它將C源代碼編譯成目標代碼,并調用GCC的后端來生成可執行文件或庫文件。
    • 特點:gcc支持多種C語言標準,如ANSI C(C89/C90)、C99和C11。開發人員可以使用gcc來編譯符合不同C語言標準的代碼,并生成與目標平臺兼容的可執行文件。
    • 選項:gcc提供了豐富的編譯選項和優化選項,開發人員可以通過這些選項來控制編譯過程中的各種行為,如優化級別、調試信息、警告設置等。
  2. g++:

    • 功能g++是GCC套件中用于編譯C++代碼的編譯器。它是gcc的C++編譯器前端,通過調用GCC的后端來生成目標代碼。
    • 特點:g++支持多種C++標準,如C++98、C++11、C++14、C++17等。開發人員可以使用g++來編譯符合不同C++標準的代碼,并生成高效的可執行文件或庫文件。
    • 選項:與gcc類似,g++也提供了豐富的編譯選項和優化選項,可以幫助開發人員優化編譯過程并生成高效的目標代碼。

除了編譯器之外,GCC還包括了一些其他工具,如預處理器、匯編器、鏈接器等,可以幫助開發人員完成整個編譯過程。

?gcc/g++的編譯指令(以gcc為例)

首先可以查看一下自己的Linux上gcc的版本,確認是否有gcc編譯器。

gcc --version

??gcc選項

  • -E 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面
  • -S 編譯到匯編語言不進行匯編和鏈接
  • -c 編譯到目標代碼
  • -o 文件輸出到 文件
  • -static 此選項對生成的文件采用靜態鏈接
  • -g 生成調試信息。GNU 調試器可利用該信息。
  • -shared 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.
  • -O0,-O1,-O2,-O3 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息

?預處理(進行宏替換)

  • 預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
  • 預處理指令可以讓編譯器進行完預處理過程后,就停止,生成目標文件。
  • 實例: gcc -E test.c -o test.i
  • 選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
  • 選項“-o”是指目標文件,-o filename 可以指定生成的可執行文件的名稱,“.i”文件為已經過預處理的C原始程序。

??編譯(生成匯編)

  • 在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
  • 用戶可以使用 “-S” 選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼
  • 實例: gcc -S test.i -o test.s

?匯編(生成機器可識別代碼)

  • 匯編階段是把編譯階段生成的“.s”文件轉成目標文件
  • 使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了
  • 實例: gcc -c test.s -o test.o

??鏈接(生成可執行文件或庫文件)

  • 在成功編譯之后,就進入了鏈接階段。
  • 實例: gcc test.o -o test.exe

?上述的四個指令,實際上在使用時都被壓縮成了一條指令,直接編譯:

gcc test.c -o test

??函數庫

?概念

函數庫(Library)是一種預先編寫好的、可重用的代碼集合,其中包含了一系列函數、類或其他程序組件,用于執行特定的任務或提供特定的功能。函數庫通常以文件或模塊的形式存在,可以在程序中引用和調用其中的函數來完成相應的操作。

比如我們的C程序中,并沒有定義“printf”的函數實現,且在預編譯中包含的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那我們為什么可以使用這個函數呢?

實際上,系統把這些函數實現都被做到名為 libc.so.6 的庫文件中去了,在沒有特別指定時,gcc 會到系統默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到 libc.so.6 庫函數中去,這樣就能實現函數“printf”了,而這也就是鏈接的作用。

??動態庫和靜態庫

  1. 靜態庫(Static Library)

    • 靜態庫在編譯時被鏈接到可執行文件中,編譯后的可執行文件包含了靜態庫中的代碼。
    • 每個使用了靜態庫的可執行文件都會包含一份靜態庫的副本,因此可執行文件體積較大。
    • 靜態庫的代碼在編譯時被復制到可執行文件中,程序運行時不需要外部庫文件
    • 靜態庫的文件擴展名通常為.lib(Windows)或.a(Unix/Linux)。
  2. 動態庫(Dynamic Library)

    • 動態庫在程序運行時才加載到內存中,可執行文件只包含對動態庫的引用。
    • 多個程序可以共享一份動態庫,減少內存占用和磁盤空間
    • 動態庫的代碼在程序運行時動態加載,可能會造成一定的性能損失。
    • 動態庫的文件擴展名通常為.dll(Windows)或.so(Unix/Linux)

gcc的默認鏈接方式是鏈接動態庫,我們可以手動修改為鏈接靜態庫:

gcc -static test.c -o test-static

可以發現通過鏈接靜態庫生成的可執行程序的大小遠遠大于通過鏈接動態庫生成的可執行程序的大小。

gcc默認生成的二進制程序,是動態鏈接的,這點可以通過 file 命令驗證。

file+filename//查看文件類型

____________________

?感謝你的閱讀,希望本文能夠對你有所幫助。如果你喜歡我的內容,記得點贊關注收藏我的博客,我會繼續分享更多的內容。?

?

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

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

相關文章

網絡金融治理模式下第三方支付風險與應對路徑

隨著經濟社會的高速發展,消費模式日益多樣化,其中,第三方支付作為一種便捷的消費支付模式,在順應時代發展潮流中應運而生。這種支付模式通過中國人民銀行批準,持有《支付業務許可證》,并與銀行簽約&#xf…

訓練yolov8+SAM的過程記錄

1-首先將拿到的數據集進行重新命名(dataset1:是經過校色之后裁剪的圖片;dataset2:原圖) 圖片文件從1.jpg開始命名的代碼: folder_path = rC:\Users\23608\Desktop\Luli_work\data\fanStudent\tongueseg\Fan\Fan\.jpg new_folder = rC:\Users\23608\Desktop\Luli_work\da…

stable diffusion官方版本復現

踩了一些坑,來記錄下 環境 CentOS Linux release 7.5.1804 (Core) 服務器RTX 3090 復現流程 按照Stable Diffusion的readme下載模型權重、我下載的是stable-diffusion-v1-4 版本的 1 因為服務器沒法上huggingface,所以得把權重下載到本地&#xff…

初識表及什么是數據表

一、了解表 1.1.概述 表是處理數據和建立關系型數據庫及應用程序的基本單元,是構成數據庫的基本元素之一,是數據庫中數據組織并儲存的單元,所有的數據都能以表格的形式組織,目的是可讀性強。 1.2.表結構簡述 一個表中包括行和列…

當項目經理的一定要考PMP嘛?

PMP資格認證并不是強制性要求,但強烈建議考慮獲取該資格!首先讓我們來了解一下PMP是什么,然后再談談為什么建議考取PMP資格的理由。 PMP(Project Management Professional)是項目管理專業人員的資格認證。該認證由全球…

SCI一區 | Matlab實現GAF-PCNN-MSA格拉姆角場和雙通道PCNN融合注意力機制的多特征分類預測

SCI一區 | Matlab實現GAF-PCNN-MSA格拉姆角場和雙通道PCNN融合注意力機制的多特征分類預測 目錄 SCI一區 | Matlab實現GAF-PCNN-MSA格拉姆角場和雙通道PCNN融合注意力機制的多特征分類預測效果一覽基本介紹模型描述程序設計參考資料 效果一覽 基本介紹 1.【SCI一區級】Matlab實…

老子云3D資源服務與應用平臺詳解

老子云平臺定位 老子云目標客群 老子云平臺架構 老子云平臺價值 核心優勢 -AMRT標準格式 -自動模型輕量化 -持續精進的底層技術算法 -千萬級輕量化3D資源素材市場 功能服務 -格式轉換 -蒙皮動畫輕量化 -傾斜攝影輕量化 -效果編輯器 -應用編輯器 -3D OFD應用 -A3D PPT -3D資源…

力扣日記2.22-【回溯算法篇】47. 全排列 II

力扣日記:【回溯算法篇】47. 全排列 II 日期:2023.2.22 參考:代碼隨想錄、力扣 47. 全排列 II 題目描述 難度:中等 給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。 示例 1: 輸…

SpringBoot中定義了Bean,但是為什么依賴注入的時候注入不了

背景&#xff1a; 擴展RedisTemplate的實現的時候寫了這樣一段代碼&#xff1a; public class BusinessRedisTemplate extends RedisTemplate<String, String> {private final String prefix "business";public BusinessRedisTemplate (RedisConnectionFact…

十八、圖像像素類型轉換和歸一化操作

項目功能實現&#xff1a;對一張圖像進行類型轉換和歸一化操作 按照之前的博文結構來&#xff0c;這里就不在贅述了 一、頭文件 norm.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class NORM { public:void norm(Mat& image); };#pragma once二…

智慧公廁是什么?智慧公廁是構建智慧城市的環境衛生基石

隨著城市化進程的不斷加速&#xff0c;城市人口密度和流動性也逐漸增大&#xff0c;對城市公共設施的需求與日俱增。而在這些公共設施中&#xff0c;公廁作為城市基礎設施中不可或缺的一環&#xff0c;對城市的環境衛生和市民生活質量起著舉足輕重的作用。如何提高公廁的管理效…

android studio 中使用kotlin語言 直接操作布局id

android studio 中使用kotlin語言 直接操作布局id 需要在 build.gradle 文件 引入 apply plugin: kotlin-android apply plugin: kotlin-android-extensions&#xff08;會自動生成&#xff0c;可忽略&#xff09;然后在 Activity 文件中 引入 對應的 layout 文件 如&#xff…

MacOs 圍爐夜話

文章目錄 一、安裝 Mac 一、安裝 Mac macOS是一套由蘋果開發的運行于Macintosh系列電腦上的操作系統。macOS是首個在商用領域成功的圖形用戶界面操作系統。 VM虛擬機怎么安裝mac os&#xff1f;&#xff08;全教程&#xff09; 虛擬機&#xff1a;VMware Workstation 17 pro W…

新書推薦:《分布式商業生態戰略:未來數字商業新邏輯與企業數字化轉型新策略》

近兩年&#xff0c;商業經濟環境的不確定性越來越明顯&#xff0c;市場經濟受到疫情、技術、政策等多方因素影響越來越難以預測&#xff0c;黑天鵝事件時有發生。在國內外經濟方面&#xff0c;國際的地緣政治對商業經濟產生著重大的影響&#xff0c;例如供應鏈中斷&#xff0c;…

Shopify配置項過多如何在代碼層面簡化輸出內容

在處理 Shopify 的配置項過多的情況下&#xff0c;可以通過在代碼層面簡化輸出內容來提高效率和可維護性。以下是一些方法&#xff1a; 1. 使用循環和條件語句 使用循環和條件語句來動態生成和輸出內容。通過遍歷配置項的列表或對象&#xff0c;可以根據條件決定是否輸出相應的…

Backend - Django SimpleUI(美化 Django Admin )

目錄 一、作用 二、安裝 & 配置 &#xff08;一&#xff09;安裝依賴 &#xff08;二&#xff09;配置 &#xff08;三&#xff09;運行 三、基礎設定 &#xff08;一&#xff09;創建用戶 &#xff08;二&#xff09;設置標題 &#xff08;三&#xff09;設置登錄…

代理模式筆記

代理模式 代理模式代理模式的應用場景先理解什么是代理&#xff0c;再理解動靜態舉例舉例所用代碼 動靜態的區別靜態代理動態代理 動態代理的優點代理模式與裝飾者模式的區別 代理模式 代理模式在設計模式中是7種結構型模式中的一種&#xff0c;而代理模式有分動態代理&#x…

rabbitmq知識梳理

一.WorkQueues模型 Work queues&#xff0c;任務模型。簡單來說就是讓多個消費者綁定到一個隊列&#xff0c;共同消費隊列中的消息。 當消息處理比較耗時的時候&#xff0c;可能生產消息的速度會遠遠大于消息的消費速度。長此以往&#xff0c;消息就會堆積越來越多&#xff0c…

四、矩陣的分類

目錄 1、相等矩陣 2、同形矩陣 3、方陣&#xff1a; 4、負矩陣、上三角矩陣、下三角矩陣&#xff1a; 5、對角矩陣&#xff1a;是方陣 ?編輯7、單位矩陣&#xff1a;常常用 E或I 來表示。它是一個方陣 8、零矩陣&#xff1a; 9、對稱矩陣&#xff1a;方陣 1、相等矩陣 …

openEuler安裝MySQL客戶端、openEuler安裝MySQL-client、openEuler部署MySQL-client

MySQL客戶端下載鏈接&#xff1a;https://downloads.mysql.com/archives/community/ mysql-community-client-5.7.30-1.el7.x86_64.rpm mysql-community-common-5.7.30-1.el7.x86_64.rpm mysql-community-libs-5.7.30-1.el7.x86_64.rpm 3個必選 8.0.22以上的版本是4個&…