chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux系統(tǒng)下C/C++的編譯流程與步驟

嵌入式學(xué)習(xí)站 ? 來(lái)源:嵌入式學(xué)習(xí)站 ? 作者:嵌入式學(xué)習(xí)站 ? 2022-11-08 16:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編譯流程分為四個(gè)階段:預(yù)處理、編譯、匯編、鏈接

Linux系統(tǒng)下g++編譯為例:

通過(guò)g++的選項(xiàng)可以查看過(guò)程中的每一步

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

編譯:進(jìn)行詞法分析、語(yǔ)法分析和語(yǔ)義分析等,生成.s的匯編文件

匯編:將對(duì)應(yīng)的匯編指令翻譯成機(jī)器指令,生成二進(jìn)制.o目標(biāo)文件

鏈接:鏈接分為兩種

靜態(tài)鏈接

在鏈接期,將靜態(tài)鏈接庫(kù)中的內(nèi)容直接裝填到可執(zhí)行程序中。

在程序執(zhí)行時(shí),這些代碼都會(huì)被裝入該進(jìn)程的虛擬地址空間中。

動(dòng)態(tài)鏈接

在鏈接期,只在可執(zhí)行程序中記錄與動(dòng)態(tài)鏈接庫(kù)中共享對(duì)象的映射信息。

在程序執(zhí)行時(shí),動(dòng)態(tài)鏈接庫(kù)的全部?jī)?nèi)容被映射到該進(jìn)程的虛擬地址空間。其本質(zhì)就是將鏈接的過(guò)程推遲到運(yùn)行時(shí)處理

擴(kuò)展:

01 為什么要有靜態(tài)鏈接?

在我們的實(shí)際開(kāi)發(fā)中,不可能將所有代碼放在一個(gè)源文件中,所以會(huì)出現(xiàn)多個(gè)源文件,而且多個(gè)源文件之間不是獨(dú)立的,而會(huì)存在多種依賴關(guān)系,如一個(gè)源文件可能要調(diào)用另一個(gè)源文件中定義的函數(shù),但是每個(gè)源文件都是獨(dú)立編譯的,即每個(gè).c文件會(huì)形成一個(gè).o文件,為了滿足前面說(shuō)的依賴關(guān)系,則需要將這些源文件產(chǎn)生的目標(biāo)文件進(jìn)行鏈接,從而形成一個(gè)可以執(zhí)行的程序。這個(gè)鏈接的過(guò)程就是靜態(tài)鏈接

由很多目標(biāo)文件進(jìn)行鏈接形成的是靜態(tài)庫(kù),反之靜態(tài)庫(kù)也可以簡(jiǎn)單地看成是一組目標(biāo)文件的集合,即很多目標(biāo)文件經(jīng)過(guò)壓縮打包后形成的一個(gè)文件

02 靜態(tài)鏈接的優(yōu)缺點(diǎn)缺點(diǎn):

浪費(fèi)空間,因?yàn)槊總€(gè)可執(zhí)行程序中對(duì)所有需要的目標(biāo)文件都要有一份副本,如果運(yùn)行多個(gè)程序并且這些程序都對(duì)同一個(gè)目標(biāo)文件有依賴,那么目標(biāo)文件在內(nèi)存中就會(huì)存在多個(gè)副本;

更新困難,因?yàn)槊慨?dāng)一個(gè)依賴文件的代碼修改了,這個(gè)時(shí)候就需要全部重新編譯鏈接形成新的可執(zhí)行程序。

優(yōu)點(diǎn):

運(yùn)行速度快并且不依賴外部環(huán)境,因?yàn)樵诳蓤?zhí)行程序中已經(jīng)具備了所有執(zhí)行程序所需要的任何東西,在執(zhí)行的時(shí)候運(yùn)行速度快。

注意:我們知道,鏈接器在鏈接靜態(tài)鏈接庫(kù)的時(shí)候是以目標(biāo)文件為單位的。比如我們引用了靜態(tài)庫(kù)中的printf()函數(shù),那么鏈接器就會(huì)把庫(kù)中包含printf()函數(shù)的那個(gè)目標(biāo)文件鏈接進(jìn)來(lái),如果很多函數(shù)都放在一個(gè)目標(biāo)文件中,很可能很多沒(méi)用的函數(shù)都被一起鏈接進(jìn)了輸出結(jié)果中。由于運(yùn)行庫(kù)有成百上千個(gè)函數(shù),數(shù)量非常龐大,每個(gè)函數(shù)獨(dú)立地放在一個(gè)目標(biāo)文件中可以盡量減少空間的浪費(fèi),那些沒(méi)有被用到的目標(biāo)文件就不要鏈接到最終的輸出文件中。

03 為什么要有動(dòng)態(tài)鏈接?

為了解決靜態(tài)鏈接中提到的兩個(gè)問(wèn)題,一方面是空間浪費(fèi),另外一方面是更新困難。

流程簡(jiǎn)介:

假設(shè)現(xiàn)在有兩個(gè)程序program1.o和program2.o,這兩者共用同一個(gè)庫(kù)lib.o,假設(shè)首先運(yùn)行程序program1,系統(tǒng)首先加載program1.o,當(dāng)系統(tǒng)發(fā)現(xiàn)program1.o中用到了lib.o,即program1.o依賴于lib.o,那么系統(tǒng)接著加載lib.o,如果program1.o和lib.o還依賴于其他目標(biāo)文件,則依次全部加載到內(nèi)存中。當(dāng)program2運(yùn)行時(shí),同樣的加載program2.o,然后發(fā)現(xiàn)program2.o依賴于lib.o,但是此時(shí)lib.o已經(jīng)存在于內(nèi)存中,這個(gè)時(shí)候就不再進(jìn)行重新加載,而是將內(nèi)存中已經(jīng)存在的lib.o映射到program2的虛擬地址空間中,從而進(jìn)行鏈接.

04 動(dòng)態(tài)鏈接的優(yōu)缺點(diǎn)優(yōu)點(diǎn):

節(jié)約內(nèi)存:即使需要每個(gè)程序都依賴同一個(gè)庫(kù),但是該庫(kù)不會(huì)像靜態(tài)鏈接那樣在內(nèi)存中存在多分,副本,而是這多個(gè)程序在執(zhí)行時(shí)共享同一份副本;

更新方便:更新時(shí)只需要替換原來(lái)的目標(biāo)文件,而無(wú)需將所有的程序再重新鏈接一遍。當(dāng)程序下一次運(yùn)行時(shí),新版本的目標(biāo)文件會(huì)被自動(dòng)加載到內(nèi)存并且鏈接起來(lái),程序就完成了升級(jí)的目標(biāo)。

缺點(diǎn):

性能略差:因?yàn)榘焰溄油七t到了程序運(yùn)行時(shí),所以每次執(zhí)行程序都需要進(jìn)行鏈接,所以性能會(huì)有一定損失。

依賴外部環(huán)境:因?yàn)榘焰溄油七t到了程序運(yùn)行時(shí),所以要保證程序運(yùn)行時(shí)外部的庫(kù)存在且內(nèi)容正確無(wú)誤。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11681

    瀏覽量

    218578
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2123

    瀏覽量

    76873

原文標(biāo)題:C/C++的編譯流程?

文章出處:【微信號(hào):嵌入式學(xué)習(xí)站,微信公眾號(hào):嵌入式學(xué)習(xí)站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    是面向過(guò)程語(yǔ)言,而C++是面向?qū)ο笳Z(yǔ)言。說(shuō)CC++的區(qū)別,也就是在比較面向過(guò)程和面向?qū)ο蟮膮^(qū)別。 1、面向過(guò)程和面向?qū)ο蟮膮^(qū)別 面向過(guò)程:面向過(guò)程編程就是分析出解決問(wèn)題的步驟,然
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

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

    C語(yǔ)言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語(yǔ)言是一種面向過(guò)程的語(yǔ)言,它強(qiáng)調(diào)的是通過(guò)函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++C語(yǔ)言的基礎(chǔ)上擴(kuò)展了面向?qū)ο蟮奶匦?,支持?class)
    發(fā)表于 12-11 06:23

    C/C++條件編譯

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

    基于安路DR1M90 FPSoC的Linux系統(tǒng)流程開(kāi)發(fā)指南(4)

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

    基于安路DR1M90 FPSoC 的Linux 系統(tǒng)流程開(kāi)發(fā)指南(3)

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

    基于安路DR1M90 FPSoC 的Linux 系統(tǒng)流程開(kāi)發(fā)指南(1)

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

    C/C++代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項(xiàng)目的相對(duì)/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測(cè) C++?并發(fā)問(wèn)題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?484次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    rtsmart開(kāi)啟C++特性支持后,工具鏈編譯內(nèi)核不通過(guò)怎么解決?

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

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

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

    不借助Linux系統(tǒng),在Windows如何搭建ZMC900E交叉編譯環(huán)境

    嵌入式Linux系統(tǒng),由于系統(tǒng)資源的匱乏,通常無(wú)法安裝本地編譯器進(jìn)行本地開(kāi)發(fā),而需要在借助一臺(tái)主機(jī)進(jìn)行交叉開(kāi)發(fā)。一般情況,在主機(jī)安裝相應(yīng)的
    的頭像 發(fā)表于 05-21 11:34 ?781次閱讀
    不借助<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>,在Windows<b class='flag-5'>下</b>如何搭建ZMC900E交叉<b class='flag-5'>編譯</b>環(huán)境

    主流的 MCU 開(kāi)發(fā)語(yǔ)言為什么是 C 而不是 C++?

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

    rtsmart開(kāi)啟C++特性支持后,工具鏈編譯內(nèi)核不通過(guò)怎么解決?

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

    源代碼加密、源代碼防泄漏c/c++與git服務(wù)器開(kāi)發(fā)環(huán)境

    源代碼加密對(duì)于很多研發(fā)性單位來(lái)說(shuō)是至關(guān)重要的,當(dāng)然每家企業(yè)的業(yè)務(wù)需求不同所用的開(kāi)發(fā)環(huán)境及開(kāi)發(fā)語(yǔ)言也不盡相同,今天主要來(lái)講一c++及git開(kāi)發(fā)環(huán)境的源代碼防泄密保護(hù)方案。企業(yè)源代碼泄密場(chǎng)景一、在很多
    的頭像 發(fā)表于 02-12 15:26 ?1024次閱讀
    源代碼加密、源代碼防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c++</b>與git服務(wù)器開(kāi)發(fā)環(huán)境

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)案例:ThreadPoll

    1、程序簡(jiǎn)介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫(kù)的線程池處理:ThreadPoll。本案例完成如下工作:創(chuàng)建1個(gè)線程池,設(shè)置該線程池內(nèi)部有1024個(gè)線程空間。啟動(dòng)5個(gè)線程
    的頭像 發(fā)表于 02-10 18:09 ?757次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)<b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:ThreadPoll