日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

hello world 程序的生成過程

 rongq2007 2021-01-16

hello world 程序的生成過程

一個c / c ++文件需要經(jīng)過預(yù)先(預(yù)處理),編譯(編譯),編譯(匯編)和鏈接(鏈接)等四步,才能生成可執(zhí)行程序。

在日常編譯中,通常“編譯”統(tǒng)稱這四步:

  • gcc -c xxx .s:匯編

  • gcc -c xxx .c:預(yù)先,編譯,匯編

  • gcc -o hello hello.c:預(yù),編譯,匯編,鏈接

預(yù)處理

1
gcc -E -o hello.i hello.c

預(yù)先用于將所有的#include頭文件以及宏定義替換成其真正的內(nèi)容,預(yù)先之后得到的仍然是文本文件,但文件體積會大很多。

部分截圖如下:

編譯

1
gcc -S -o hello.s hello.i

將通過預(yù)處理之后的程序轉(zhuǎn)換成特定的匯編代碼(匯編代碼)的過程:根據(jù).i文件編譯得到匯流編碼文件hello.s

匯編

1
2
3
gcc -c -o hello.o hello.s
或者
as -o hellp.o hello.s

匯編過程將上一步的匯編代碼轉(zhuǎn)換成機器碼(機器代碼),這一步產(chǎn)生的文件稱為目標(biāo)文件,是二進制格式。gcc匯編過程通過as命令完成或者通過-c選項

鏈接

鏈接過程將多個目標(biāo)文(.o)以及所需的庫文件(.a或.so等)鏈接成最終的插入文件(可執(zhí)行文件)

1
gcc -o hello hello.o

最終可以看到一個hello world的生成過程包含許多中間過程,進行預(yù)處理,編譯,編譯和鏈接。而我們?nèi)粘J褂胓cc hello.c之間生成a.out忽略了許多中間環(huán)境。

總結(jié)

本文以gcc為例,通過hello world應(yīng)用程序,簡單介紹了一個c / c ++應(yīng)用的生成過程,旨在幫助構(gòu)建加深理解,日常使用ide開發(fā)實際上屏蔽了很多細(xì)節(jié),很多集成開發(fā)環(huán)境自動配置編譯環(huán)境,開發(fā)者無需了解這些細(xì)節(jié),不過當(dāng)需要自己通過Makefie組織項目編譯時,始終繞不開這些基本知識。

-----------------------------------------------------------------------------------------------

再看這個圖的時候,有就一個種一定要能從A-》B-》C-》D單步編譯出來。


這么一個程序:

#include <stdio.h>

int main()

{

  printf("Hello world!\n");

  return 0;

}

1.預(yù)處理
cpp hello.c - o hello.i
2.編譯
gcc -E hello.i -o hello.s
2.匯編器
as  hello.s -o hello.o
2.鏈接器
ld -e main -dynamic-linker /lib/ld-linux.so.2 -o hello -lc hello.o
(鏈接出來的程序“helloworld”能夠打印出來,但是會有段錯誤,目前只能用 gcc hello.o -o hello來鏈接)
這個過程看似無用,但是是在寫裸機代碼時候包括u-boot的時候沒有操作系統(tǒng)的運行就必須自己運行一步步編譯。
今天總結(jié)的過程不算是完善的,下次還要再細(xì)化一下。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多