程式的編譯和鏈結原理分析

2021-09-24 08:15:20 字數 2200 閱讀 4738

記錄下學習《跟我一起寫makefile》這本書時整理的筆記。

一、原理說明

unix 下是 .o 檔案,即 object file,這個動作叫做編譯(compile)。然後再把大量object file 合成執行檔案,這個動作叫作鏈結(link)。

一般來說,每個原始檔都應該對應於乙個中間目標檔案(o 檔案或是 obj 檔案)。鏈結時,主要是鏈結函式和全域性變數,所以,我們可以使用這些中間目標檔案(o 檔案或是obj檔案)來鏈結我們的應用程式。鏈結器並不管函式所在的原始檔,只管函式的中間目標檔案(object file)。

我們要給中間目標檔案打個包,在 windows 下這種包叫「庫檔案」(library file),也就是.lib 檔案,在 unix下,是 archive file,也就是 .a 檔案。

總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出乙個警告,但可以生成 object file。而在鏈結程式時,鏈結器會在所有的 object file 中找尋函式的實現,如果找不到,那到就會報鏈結錯誤碼(linker error),意思說是說,鏈結器未能找到函式的實現。你需要指定函式的object file。

二、簡單的編譯鏈結流程例項

產生可執行檔案a.out,中間產生main.o的目標檔案,但在鏈結成功後刪除。

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c 

a.out hello.c main.c

複製**

-c 引數意味著只編譯(compile) 產生main.o目標檔案

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -c main.c 

main.o hello.c main.c

複製**

鏈結檔案,預設為a.out

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o

a.out

複製**

-o name 使鏈結器儲存可執行檔案為指定檔案中,name為指定檔名。

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -o main.o

gcc: fatal error: no input files

compilation terminated.

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o -o run

hello.c main.c main.o makefile run

複製**

可以結合起來使用

gcc main.c -o run

複製**

編譯main.c並鏈結生成可執行檔案run,並將中間產生的目標檔案main.o刪除。

三、目標檔案打包與鏈結

使用ar命令將目標檔案打包,不過一般這個動作都是在makefile中實現。 鏈結靜態庫引數說明,-l 表示靜態庫路徑,-lmy 即鏈結libmy.a檔案

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# cat main.c 

#include

void main

()root@chenwr-pc:/home/workspace/my_workspace/study/makefile# ar rcs libmy.a test.o hello.o

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c -l . -lmy -o run

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# ./run

im a super man

hello world

test

複製**

程式編譯和鏈結原理理解

一 本書解決的問題 本書主要介紹系統軟體的執行機制和原理,涉及在windows和linux兩個系統平台下,乙個應用程式在編譯 鏈結 和執行時所做的事,具體如下 1.windows和linux作業系統下各自的可執行檔案 目標檔案格式?2.普通的c c 程式 如何編譯成目標檔案及程式的目標檔案如何儲存?...

gcc程式的編譯過程和鏈結原理

1.預處理 處理標頭檔案 預處理就是將要包含 include 的檔案插入原檔案中 將巨集定義展開 根據條件編譯命令選擇要使用的 最後將這些 輸出到乙個 i 檔案中等待進一步處理。gcc e o 001.i 001.c2.編譯編譯就是把c c 比如上面的 i 檔案 翻譯 成彙編 gcc s o 001...

程式的編譯和鏈結

一般來說,無論是c c 還是pas,首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的 object file合成執行檔案,這個動作叫作鏈結 link 編譯時,編譯器需要的是語法...