gcc編譯,ld連線

2021-05-23 21:03:16 字數 655 閱讀 9597

編寫乙個hello world的簡單程式(hello.c):

1:  

#include

2:  

3:  

intmain

(void

)

4:  

直接編譯很簡單:

gcc –o hello.o hello.c

但是如果使用gcc編譯,然後使用ld連線,就會出錯:

gcc –c –o hello.o hello.c

ld –o hello hello.o

連線時警告沒有入口_start(程式原始的入口為_start,執行一些堆疊初始化工作,然後再跳入main函式),生成的hello檔案無法執行。

說明分開連線的時候少做了一些事,使用gcc -v選項檢視gcc編譯時的資訊:

gcc –o hello.o hello.c –v

最終的解決方案是:

gcc –c –o hello.o hello.c

ld –o hello –dynamic-linker /lib/ld-linker.so.2 /usr/lib/crt1.o /usr/lib/crti.o –l hello.o /usr/lib/ctrn.o

編譯就可以了。

GCC編譯連線

引數 e 可以完成程式的預處理工作而不進行其他的編譯工作。gcc e o a.cxx a.c 輸入下面的命令,檢視經過預處理以後的a.cxx 檔案。vim a.cxx 引數 s 可以控制gcc 在編譯c 程式時只生成相應的匯程式設計序檔案,而不繼續執行後面的 編譯。下面的命令,可以將本章中的c 程式...

編譯 GCC 連線順序

當使用兩個靜態庫存在依賴的時候,連線的時候可能會遇 undefined reference to 問題。這裡我們使用a.c b.c main.c 來說明 acall.h ifndef acall h define acall h int acall int a,int b endif bcall.h...

gcc編譯過程

本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...