最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux下編譯C程序的過(guò)程

 更新時(shí)間:2016年01月17日 11:15:52   投稿:hebedich  
我們總是在Linux下輸入 gcc -o app main.c 即可編譯好程序,對(duì)于具體的詳細(xì)過(guò)程及流程,相信親們就不太了解啦!下面給大家展示一下C編譯器的解釋全過(guò)程。

學(xué)習(xí)一門(mén)語(yǔ)言程序,本人覺(jué)得還是得學(xué)習(xí)它的編譯規(guī)則,現(xiàn)在,通過(guò)小例子小結(jié)下自己對(duì)C編譯的認(rèn)識(shí)。

/*test.c   了解C程序的編譯*/

#include <stdio.h>
int main(void)
{
 printf("Hello World!\n");
 return 0;
}

對(duì)于test.c,我們常用一步編譯到位的命令是:

gcc -o test test.c 或者 gcc test.c -o test

實(shí)際上,上面的這個(gè)編譯命令包含了四個(gè)階段的處理,即預(yù)處理(也稱(chēng)預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編 (Assembly)和連接(Linking)。

這里詳細(xì)列舉完整的編譯過(guò)程

預(yù)處理:

作用:  預(yù)處理的作用主要是讀入源代碼,檢查包含預(yù)處理指令的語(yǔ)句和宏定義,并對(duì)源代碼進(jìn)行響應(yīng)的轉(zhuǎn)換。預(yù)處理過(guò)程還會(huì)刪除程序中的注釋和多余的空白字符。

對(duì)象:  預(yù)處理指令是以“#”開(kāi)頭的,預(yù)處理的處理對(duì)象主要包括以下方面:

 ?。?)#define  宏定義

 ?。?)#運(yùn)算符    #運(yùn)算符作用是把跟在其后的參數(shù)轉(zhuǎn)換成一個(gè)字符串?!    ?/p>

      /***例***/
      #define PASTE(n) "adhfkj"#n
      int main()
      {
         printf("%s\n",PASTE(15));
         return 0;
      }
      /********輸出adhfj15*********/

 ?。?)##運(yùn)算符  ##運(yùn)算符的作用用于把參數(shù)連接到一起?!?/p>

    /*****例*****/
    #define NUM(a,b,c) a##b##c
    #define STR(a,b,c) a##b##c
    int main()
     {
       printf("%d\n",NUM(1,2,3));
       printf("%s\n",STR("aa","bb","cc"));
       return 0;
     }
  /*********最后程序的輸出為:aabbcc**********/

 ?。?)條件編譯指令

  (5)頭文件包含指令

 ?。?)特殊符號(hào)

__FILE__包含當(dāng)前程序文件名的字符串

__LINE__表示當(dāng)前行號(hào)的整數(shù)

__DATE__包含當(dāng)前日期的字符串

__TIME__包含當(dāng)前的字符串

如上面的test.c文件的預(yù)處理指令是

gcc -E test.c -o test.i

編譯-編譯成匯編語(yǔ)言

gcc -S test.i -o test.s

這是上面代碼編譯出來(lái)test.s的內(nèi)容

.file "test.c"
 .section .rodata
.LC0:
 .string "hello world"
 .text
.globl main
 .type main, @function
main:
.LFB0:
 .cfi_startproc
 pushq %rbp
 .cfi_def_cfa_offset 16
 .cfi_offset 6, -16
 movq %rsp, %rbp
 .cfi_def_cfa_register 6
 movl $.LC0, %edi
 call puts
 movl $0, %eax
 leave
 .cfi_def_cfa 7, 8
 ret
 .cfi_endproc
.LFE0:
 .size main, .-main
 .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
 .section .note.GNU-stack,"",@progbits

匯編

作用:將上面的匯編指令編譯生成目標(biāo)文件

gcc -c test.s -o test.o

這是上面的test.o文件的內(nèi)容

ELF  >  8 @ @ 
 UH夊? ? ? 擅 hello world GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)  zR x ?    A?C P  .symtab .strtab .shstrtab .rela.text .data .bss .rodata .comment .note.GNU-stack .rela.eh_frame   @     ? 0    &   X  ,   X  1   X  9  0 d -   B  ?  W   ? 8  R  ?       ? a    x     €     ?                    test.c main puts  
 ?  

鏈接

鏈接的主要目的是將程序的目標(biāo)文件與所需要附加的目標(biāo)文件鏈接起來(lái),最終生成可執(zhí)行文件。附加的目標(biāo)文件也包括了所需要的庫(kù)文件(靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù))

gcc test.o -o test

最終生成的test文件就是最終系統(tǒng)可以執(zhí)行的文件。

對(duì)于程序的編譯,我們一般把它認(rèn)為“編譯”和“鏈接”兩部分也足夠了,這里的編譯已經(jīng)包括了預(yù)處理,編譯成匯編語(yǔ)言和編譯成目標(biāo)文件三個(gè)步驟了。只要頭文件完整,語(yǔ)法無(wú)誤,編譯一般都能通過(guò)。只要有完整的目標(biāo)文件和功能庫(kù)文件,鏈接也可以成功。只要編譯通過(guò)了,鏈接也通過(guò)了,整個(gè)項(xiàng)目的編譯就算完成了。

相關(guān)文章

  • 詳解如何使用VSCode和CMake構(gòu)建跨平臺(tái)的C/C++開(kāi)發(fā)環(huán)境

    詳解如何使用VSCode和CMake構(gòu)建跨平臺(tái)的C/C++開(kāi)發(fā)環(huán)境

    本文主要介紹了如何使用VSCode和CMake構(gòu)建跨平臺(tái)的C/C++開(kāi)發(fā)環(huán)境,想進(jìn)行跨平臺(tái)開(kāi)發(fā)的同學(xué)們,一定要看一下
    2021-06-06
  • C語(yǔ)言實(shí)現(xiàn)xml構(gòu)造解析器

    C語(yǔ)言實(shí)現(xiàn)xml構(gòu)造解析器

    本文給大家分享的是使用C語(yǔ)言來(lái)實(shí)現(xiàn)xml構(gòu)造解析器的方法和代碼,簡(jiǎn)單易用,推薦給大家
    2016-07-07
  • c++中關(guān)于max_element()函數(shù)解讀

    c++中關(guān)于max_element()函數(shù)解讀

    這篇文章主要介紹了c++中關(guān)于max_element()函數(shù)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)俄羅斯方塊源碼

    C++實(shí)現(xiàn)俄羅斯方塊源碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)俄羅斯方塊源碼完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • QT QML的元素布局的實(shí)現(xiàn)

    QT QML的元素布局的實(shí)現(xiàn)

    這篇文章主要介紹了QT QML的元素布局的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 用C語(yǔ)言遞歸實(shí)現(xiàn)火車(chē)調(diào)度算法詳解

    用C語(yǔ)言遞歸實(shí)現(xiàn)火車(chē)調(diào)度算法詳解

    本文主要介紹了用C語(yǔ)言遞歸實(shí)現(xiàn)火車(chē)調(diào)度算法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 關(guān)于C語(yǔ)言中參數(shù)的傳值問(wèn)題

    關(guān)于C語(yǔ)言中參數(shù)的傳值問(wèn)題

    C語(yǔ)言中參數(shù)的傳值一直比較含糊,今天在網(wǎng)上看到三個(gè)面試題的詳解,感覺(jué)講的很好,就拿來(lái)記下,方便學(xué)習(xí)和記憶
    2013-10-10
  • C++日期類(lèi)的實(shí)現(xiàn)日期計(jì)算器舉例詳解

    C++日期類(lèi)的實(shí)現(xiàn)日期計(jì)算器舉例詳解

    這篇文章主要給大家介紹了關(guān)于C++日期類(lèi)實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,我們要考慮日期的增加和減少,自增和自減,以及兩個(gè)日期類(lèi)的比較,以及當(dāng)前日期類(lèi)的日期顯示和用戶(hù)的輸入輸出,需要的朋友可以參考下
    2024-05-05
  • 一篇文章帶你入門(mén)C++的異常處理

    一篇文章帶你入門(mén)C++的異常處理

    C++ 提供了異常機(jī)制,讓我們能夠捕獲運(yùn)行時(shí)錯(cuò)誤,本文就詳細(xì)的介紹了C++異常處理入門(mén),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 深入C語(yǔ)言?xún)?nèi)存區(qū)域分配(進(jìn)程的各個(gè)段)詳解

    深入C語(yǔ)言?xún)?nèi)存區(qū)域分配(進(jìn)程的各個(gè)段)詳解

    一般情況下,一個(gè)可執(zhí)行二進(jìn)制程序(更確切的說(shuō),在Linux操作系統(tǒng)下為一個(gè)進(jìn)程單元,在UC/OSII中被稱(chēng)為任務(wù))在存儲(chǔ)(沒(méi)有調(diào)入到內(nèi)存運(yùn)行)時(shí)擁有3個(gè)部分,分別是代碼段(text)、數(shù)據(jù)段(data)和BSS段。這3個(gè)部分一起組成了該可執(zhí)行程序的文件
    2013-07-07

最新評(píng)論

汾阳市| 保康县| 阿瓦提县| 敦煌市| 搜索| 安康市| 合阳县| 高碑店市| 瓦房店市| 汨罗市| 水富县| 柳州市| 蕉岭县| 乐清市| 壶关县| 阿巴嘎旗| 浠水县| 紫阳县| 高州市| 千阳县| 息烽县| 宁波市| 贡觉县| 唐山市| 抚松县| 文成县| 嘉祥县| 延庆县| 怀仁县| 焉耆| 吉首市| 高碑店市| 青岛市| 平远县| 唐河县| 左贡县| 麻城市| 宁陵县| 张家港市| 长子县| 松溪县|