国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux系統下C/C++的編譯流程與步驟

嵌入式學習站 ? 來源:嵌入式學習站 ? 作者:嵌入式學習站 ? 2022-11-08 16:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編譯流程分為四個階段:預處理、編譯、匯編、鏈接

Linux系統下g++編譯為例:

通過g++的選項可以查看過程中的每一步

預處理:處理一些#號定義的命令或語句(如#define、#include、#ifdef等),生成.i文件

編譯:進行詞法分析、語法分析和語義分析等,生成.s的匯編文件

匯編:將對應的匯編指令翻譯成機器指令,生成二進制.o目標文件

鏈接:鏈接分為兩種

靜態鏈接

在鏈接期,將靜態鏈接庫中的內容直接裝填到可執行程序中。

在程序執行時,這些代碼都會被裝入該進程的虛擬地址空間中。

動態鏈接

在鏈接期,只在可執行程序中記錄與動態鏈接庫中共享對象的映射信息。

在程序執行時,動態鏈接庫的全部內容被映射到該進程的虛擬地址空間。其本質就是將鏈接的過程推遲到運行時處理

擴展:

01 為什么要有靜態鏈接?

在我們的實際開發中,不可能將所有代碼放在一個源文件中,所以會出現多個源文件,而且多個源文件之間不是獨立的,而會存在多種依賴關系,如一個源文件可能要調用另一個源文件中定義的函數,但是每個源文件都是獨立編譯的,即每個.c文件會形成一個.o文件,為了滿足前面說的依賴關系,則需要將這些源文件產生的目標文件進行鏈接,從而形成一個可以執行的程序。這個鏈接的過程就是靜態鏈接

由很多目標文件進行鏈接形成的是靜態庫,反之靜態庫也可以簡單地看成是一組目標文件的集合,即很多目標文件經過壓縮打包后形成的一個文件

02 靜態鏈接的優缺點缺點:

浪費空間,因為每個可執行程序中對所有需要的目標文件都要有一份副本,如果運行多個程序并且這些程序都對同一個目標文件有依賴,那么目標文件在內存中就會存在多個副本;

更新困難,因為每當一個依賴文件的代碼修改了,這個時候就需要全部重新編譯鏈接形成新的可執行程序。

優點:

運行速度快并且不依賴外部環境,因為在可執行程序中已經具備了所有執行程序所需要的任何東西,在執行的時候運行速度快。

注意:我們知道,鏈接器在鏈接靜態鏈接庫的時候是以目標文件為單位的。比如我們引用了靜態庫中的printf()函數,那么鏈接器就會把庫中包含printf()函數的那個目標文件鏈接進來,如果很多函數都放在一個目標文件中,很可能很多沒用的函數都被一起鏈接進了輸出結果中。由于運行庫有成百上千個函數,數量非常龐大,每個函數獨立地放在一個目標文件中可以盡量減少空間的浪費,那些沒有被用到的目標文件就不要鏈接到最終的輸出文件中。

03 為什么要有動態鏈接?

為了解決靜態鏈接中提到的兩個問題,一方面是空間浪費,另外一方面是更新困難。

流程簡介:

假設現在有兩個程序program1.o和program2.o,這兩者共用同一個庫lib.o,假設首先運行程序program1,系統首先加載program1.o,當系統發現program1.o中用到了lib.o,即program1.o依賴于lib.o,那么系統接著加載lib.o,如果program1.o和lib.o還依賴于其他目標文件,則依次全部加載到內存中。當program2運行時,同樣的加載program2.o,然后發現program2.o依賴于lib.o,但是此時lib.o已經存在于內存中,這個時候就不再進行重新加載,而是將內存中已經存在的lib.o映射到program2的虛擬地址空間中,從而進行鏈接.

04 動態鏈接的優缺點優點:

節約內存:即使需要每個程序都依賴同一個庫,但是該庫不會像靜態鏈接那樣在內存中存在多分,副本,而是這多個程序在執行時共享同一份副本;

更新方便:更新時只需要替換原來的目標文件,而無需將所有的程序再重新鏈接一遍。當程序下一次運行時,新版本的目標文件會被自動加載到內存并且鏈接起來,程序就完成了升級的目標。

缺點:

性能略差:因為把鏈接推遲到了程序運行時,所以每次執行程序都需要進行鏈接,所以性能會有一定損失。

依賴外部環境:因為把鏈接推遲到了程序運行時,所以要保證程序運行時外部的庫存在且內容正確無誤。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11760

    瀏覽量

    219032
  • C++
    C++
    +關注

    關注

    22

    文章

    2124

    瀏覽量

    77115

原文標題:C/C++的編譯流程?

文章出處:【微信號:嵌入式學習站,微信公眾號:嵌入式學習站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言與C++的區別及聯系

    是面向過程語言,而C++是面向對象語言。說CC++的區別,也就是在比較面向過程和面向對象的區別。 1、面向過程和面向對象的區別 面向過程:面向過程編程就是分析出解決問題的步驟,然
    發表于 12-24 07:23

    CC++之間的聯系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++編譯
    發表于 12-11 06:51

    C語言和C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)
    發表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時根據條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯使用預處理指令 #ifdef、#endif、
    發表于 12-05 06:21

    基于安路DR1M90 FPSoC的Linux系統流程開發指南(4)

    本手冊由創龍科技研發,針對安路飛龍 DR1M90,詳述 Linux 系統開發流程:LinuxSDK 配置編譯、BOOT.bin(FSBL+U-Boot)開發、Kernel 與 Root
    的頭像 發表于 11-30 15:46 ?2183次閱讀
    基于安路DR1M90 FPSoC的<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>全<b class='flag-5'>流程</b>開發指南(4)

    基于安路DR1M90 FPSoC 的Linux 系統流程開發指南(3)

    本手冊由創龍科技研發,針對安路飛龍 DR1M90,詳述 Linux 系統開發流程:LinuxSDK 配置編譯、BOOT.bin(FSBL+U-Boot)開發、Kernel 與 Root
    的頭像 發表于 11-26 17:01 ?318次閱讀
    基于安路DR1M90 FPSoC 的<b class='flag-5'>Linux</b> <b class='flag-5'>系統</b>全<b class='flag-5'>流程</b>開發指南(3)

    基于安路DR1M90 FPSoC 的Linux 系統流程開發指南(1)

    本手冊由創龍科技研發,針對安路飛龍 DR1M90,詳述 Linux 系統開發流程:LinuxSDK 配置編譯、BOOT.bin(FSBL+U-Boot)開發、Kernel 與 Root
    的頭像 發表于 11-25 14:09 ?386次閱讀
    基于安路DR1M90 FPSoC 的<b class='flag-5'>Linux</b> <b class='flag-5'>系統</b>全<b class='flag-5'>流程</b>開發指南(1)

    C/C++代碼靜態測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項目的相對/根路徑的支持。C++?分析也得到了增強,增加了用于檢測 C++?并發問題的新檢查,并改進了實體名稱和實
    的頭像 發表于 10-13 18:11 ?572次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態測試工具Perforce QAC 2025.3的新特性

    rtsmart開啟C++特性支持后,工具鏈編譯內核不通過怎么解決?

    各位大佬好,本人在rtsmart項目中需要使用C++11特性,在menuconfig那里配置了支持C++特性后,使用7.3.0版本的arm-linux-musleabi編譯
    發表于 09-29 07:49

    國產!全志T113-i 雙核Cortex-A7@1.2GHz 工業開發板—Linux系統使用手冊(三)

    本文檔詳細介紹了T113開發板的Linux環境搭建與系統編譯流程。主要內容包括:1)開發環境要求(Windows/VMware/Ubuntu版本);2)Linux SDK安裝
    的頭像 發表于 09-04 14:56 ?667次閱讀
    國產!全志T113-i 雙核Cortex-A7@1.2GHz 工業開發板—<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>使用手冊(三)

    國產!全志T113-i 雙核Cortex-A7@1.2GHz 工業開發板—Linux系統使用手冊(二)

    本文檔詳細介紹了T113開發板的Linux環境搭建與系統編譯流程。主要內容包括:1)開發環境要求(Windows/VMware/Ubuntu版本);2)Linux SDK安裝
    的頭像 發表于 09-02 16:36 ?718次閱讀
    國產!全志T113-i 雙核Cortex-A7@1.2GHz 工業開發板—<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>使用手冊(二)

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時,你會發現Python和Scratch是許多任務(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發表于 08-06 15:33 ?4153次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    不借助Linux系統,在Windows如何搭建ZMC900E交叉編譯環境

    嵌入式Linux系統,由于系統資源的匱乏,通常無法安裝本地編譯器進行本地開發,而需要在借助一臺主機進行交叉開發。一般情況,在主機安裝相應的
    的頭像 發表于 05-21 11:34 ?933次閱讀
    不借助<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>,在Windows<b class='flag-5'>下</b>如何搭建ZMC900E交叉<b class='flag-5'>編譯</b>環境

    主流的 MCU 開發語言為什么是 C 而不是 C++

    在單片機的地界兒里,C語言穩坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉。先說內存這道坎兒。您當stm32f4的256kRAM
    的頭像 發表于 05-21 10:33 ?1041次閱讀
    主流的 MCU 開發語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    rtsmart開啟C++特性支持后,工具鏈編譯內核不通過怎么解決?

    各位大佬好,本人在rtsmart項目中需要使用C++11特性,在menuconfig那里配置了支持C++特性后,使用7.3.0版本的arm-linux-musleabi編譯
    發表于 03-10 08:06