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

Linux下編譯C程序的過程

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

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

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

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

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

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

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

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

預(yù)處理:

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

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

  (1)#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*********/

  (3)##運(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**********/

 ?。?)條件編譯指令

 ?。?)頭文件包含指令

 ?。?)特殊符號

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

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

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

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

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

gcc -E test.c -o test.i

編譯-編譯成匯編語言

gcc -S test.i -o test.s

這是上面代碼編譯出來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)文件鏈接起來,最終生成可執(zhí)行文件。附加的目標(biāo)文件也包括了所需要的庫文件(靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫)

gcc test.o -o test

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

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

相關(guān)文章

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

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

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

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

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

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

    這篇文章主要介紹了c++中關(guān)于max_element()函數(shù)解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(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),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 用C語言遞歸實(shí)現(xiàn)火車調(diào)度算法詳解

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

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

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

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

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

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

    一篇文章帶你入門C++的異常處理

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

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

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

最新評論

上思县| 东乡族自治县| 杨浦区| 乐业县| 乐亭县| 西乌珠穆沁旗| 开平市| 楚雄市| 长治县| 泰和县| 常山县| 农安县| 娱乐| 北京市| 兴隆县| 永春县| 高平市| 尼勒克县| 饶河县| 阳信县| 鹤山市| 胶州市| 左权县| 湄潭县| 丁青县| 池州市| 买车| 南澳县| 松江区| 波密县| 曲麻莱县| 临武县| 乐亭县| 南漳县| 景德镇市| 敦煌市| 阳西县| 大同市| 韶山市| 岳普湖县| 江陵县|