c編譯鏈接過程
宏在編譯之前,需要進行預處理,將宏直接提換成宏定義的代碼,是直接替換,也就是說,在預處理之後,你再看代碼,發現宏定義已經被替換過來了,你看到是你定義之後的那一串代碼。
而函數,在編譯之後,有一系列調用函數的過程,比如,傳參,壓棧等,這部分是編譯器所做的。
C 語言編譯鏈接過程:
test.c(原始代碼) --> 預處理 --> test.i(經過預處理的)--> 編譯 --> test.s(匯編代碼)--> 匯編 --> test.o(目標文件,其實這部分已經是單個文件的完整二進制文件了,只是還不能執行,如果不懂這句話,可以再問我,其實這部分知識,平時也很少遇到) --> 鏈接 --> test (可執行文件,比如一個程序由3個代碼文件共同生成,那麼就會有3個.o格式目標文件,鏈接是把多個目標文件真正的聯系在一起,比如a.o 中使用了 b.o中的一個函數,那麼它們兩個之間的地址是如何確定的(同理,可引申到使用函數庫的問題,使用printf函數,也是需要鏈接器進行確定printf函數地址,才能知道如何調用。)這個就是鏈接器的作用)
2. 寫了一個程序可以編譯c語言,怎麼自動再鏈接然後執行生成的可執行文件
編譯的大致過程如下:
你完成的其實是前面一部分,的第一階段,生成了中間代碼。
目標代碼,即目標文件包含著機器代碼(可直接被計算機中央處理器執行)以及代碼在運行時使用的數據,如重定位信息,如用於鏈接或調試的程序符號(變數和函數的名字),此外還包括其他調試信息。
後面是由鏈接程序將編譯後形成的一組目標模塊以及它們所需要的庫函數鏈接在一起,形成一個完整的載入模塊。
目前的編譯工具通常編譯器和鏈接器都是分開,例如GNU的編譯器是gcc,鏈接器是ld
3. 在計算機上運行一個C語言編寫的程序,要經過怎樣的處理過程
開發一個C語言程序需要經過的四個步驟:編輯、編譯、連接、運行。
C語言程序可以使用在任意架構的處理器上,只要那種架構的處理器具有對應的C語言編譯器和庫,然後將C源代碼編譯、連接成目標二進制文件之後即可運行。
1、編輯:輸入源程序並保存(。C文件)。
2、編譯:將源程序翻譯成目標文件(。OBJ文件)。
3、連接:將目標文件轉換成可執行文件。EXE文件)。
4、運行:執行。EXE文件,得到運行結果。
(3)c編譯鏈接過程擴展閱讀:
C代碼變成程序的階段:
1、首先,源代碼文件test。c和相關的頭文件,如stdio。h,由預處理程序CPP預處理為一個。我的文件。這是預編譯。I文件不包含任何宏定義,因為所有宏都已展開,所包含的文件都已插入其中。我的文件。
2、編譯過程就是對預處理後的文件進行一系列的詞法分析、語法分析、語義分析和優化,從而產生相應的匯編代碼文件。這個過程通常是整個程序構造的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成一個可以運行的可執行程序。為了得到最終的可執行文件「A.out」,需要將一大堆文件鏈接在一起。
4、在鏈接過程中,調用其他目標文件中定義的函數的指令需要重新校準,使用其他目標文件中定義的變數的指令也需要重新校準。
4. c語言裡面的編譯和鏈接是怎麼回事
C/C++語言的完整編譯過程是
一、預編譯
處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。
二、編譯
把上面那個原文件編譯成.o或者VC里是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變數的描述、乃至段的描述等等。
三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到一起。(這里也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合一些其他數據,比如資源、可執行文件頭等等。
5. 開發一個c語言程序要經過哪四個步驟
開發一個C語言程序需要經過的四個步驟:編輯、編譯、連接、運行。
C語言程序可以使用在任意架構的處理器上,只要那種架構的處理器具有對應的C語言編譯器和庫,然後將C源代碼編譯、連接成目標二進制文件之後即可運行。
1、預處理:輸入源程序並保存(.C文件)。
2、編譯:將源程序翻譯為目標文件(.OBJ文件)。
3、鏈接:將目標文件生成可執行文件(.EXE文件)。
4、運行:執行.EXE文件,得到運行結果。
(5)c編譯鏈接過程擴展閱讀:
C語言代碼變為程序的幾個階段:
1、首先是源代碼文件test.c和相關的頭文件,如stdio.h等被預處理器cpp預處理成一個.i文件。經過預編譯後的.i文件不包含任何宏定義,因為所有的宏已經被展開,並且包含的文件也已經被插入到.i文件中。
2、編譯過程就是把預處理完的文件進行一系列的詞法分析、語法分析、語義分析以及優化後產生相應的匯編代碼文件,這個過程往往是我們所說的整個程序的構建的核心部分,也是最復雜的部分之一。
3、匯編器不直接輸出可執行文件而是輸出一個目標文件,匯編器可以調用ld產生一個能夠運行的可執行程序。即需要將一大堆文件鏈接起來才可以得到「a.out」,即最終的可執行文件。
4、在鏈接過程中,對其他定義在目標文件中的函數調用的指令需要被重新調整,對實用其他定義在其他目標文件的變數來說,也存在同樣問題。
參考資料來源:網路-c語言
6. c語言裡面的編譯和鏈接是怎麼回事啊
編譯是把你輸入的源代碼生成目標代碼(即:以.obj為後綴名的文件),連接是把.obj文件和系統庫相連接(如:#include 中所聲明的文件)。如果直接按run,如果源代碼正確則是系統自動編譯連接,要是源代碼有錯誤則無法運行,並顯示錯誤信息。
7. c語言的編譯過程是什麼
c語言的編譯過程如下:
1、預處理:預處理過程實際上是處理「#」的過程:#include包含的頭文件直接拷貝到hello.c中;#define定義的宏定義進行替換,同時刪除代碼中沒有的注釋部分。2、編譯:編譯的過程實質上是將高級語言翻譯成機器語言的過程。3、匯編:匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表一一翻譯即可。4、鏈接:就像hello.c中使用到了C標准庫的東西「printf」,但是編譯過程只是將源文件翻譯成二進制文件而已,這個二進制文件還不能直接執行,還需要一個動作:將翻譯成的二進制文件與需要用到的庫綁定在一塊。
補充:編譯過程可分為6步:掃描(詞法分析)、語法分析、語義分析、源代碼優化、代碼生成、目標代碼優化。