2016-08-24 59 views
11

我試圖更深入地理解C編譯,因此我正在編譯和鏈接「手動」。這裏是我的代碼在最小的C程序中未定義對「main」的引用

int main() 
{ 
    return 0; 
} 

,這裏是什麼,我投入我的控制檯(Windows)中:

gcc -S main.c 
as main.s -o main.o 
ld main.o 

,並試圖鏈接的時候,我得到:

main.o:main.c:(text+0x7): undefined reference to `__main' 
+2

運行'gcc -v main.c'來查看編譯器實際運行的命令。請注意,它爲'ld'運行的命令行要比給出的命令行復雜得多。 –

+0

海灣合作委員會極其冗長的'ld'論點並不總是強制性的。一個簡單的'Hello,world'程序只能與'ld -lc -lkernel32 src.o -o src.exe'完全鏈接。 –

+0

@RyanB我得到「找不到-lc」。 –

回答

12

你沒有鏈接任何必要的支持庫。像stdin,stdout,stderr這樣的C全局對象不會從任何地方出現。命令參數和環境變量從操作系統中提取。並退出所有這些atexit()功能被調用,並從main返回代碼被傳遞到exit(return_code)。等等

查看命令gcc -dumpspecs,gcc -print-libgcc-file-name。查看該目錄中的所有其他庫。您會在dumpspecs的輸出中找到很多這些庫和對象文件。我不清楚這些規範規則何時或如何解釋,但你可能會明白。我認爲如果您深入挖掘,GCC信息頁面info gcc會詳細解釋它。

info gcc,然後按「G」,然後輸入「規格文件」

正如喬納森·萊弗勒說,快捷方式是與verbose選項運行gcc:gcc -v,只是看到它使用什麼命令。

+0

但是,如果問題是支持庫,爲什麼對「__main」的未定義引用? –

+0

@JackM這是在'main'中執行實際工作的函數,例如參見:https://gcc.gnu.org/onlinedocs/gccint/Collect2.html – deamentiaemundi

+0

另外,如果你想挖掘ASM,練習將關閉優化(-O0標誌)。這裏沒有用處,因爲有任何功能和優化要做,但我認爲值得指出。 –

相關問題