編寫乙個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 編譯。...