我試圖更深入地理解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'
我試圖更深入地理解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'
你沒有鏈接任何必要的支持庫。像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
,只是看到它使用什麼命令。
但是,如果問題是支持庫,爲什麼對「__main」的未定義引用? –
@JackM這是在'main'中執行實際工作的函數,例如參見:https://gcc.gnu.org/onlinedocs/gccint/Collect2.html – deamentiaemundi
另外,如果你想挖掘ASM,練習將關閉優化(-O0標誌)。這裏沒有用處,因爲有任何功能和優化要做,但我認爲值得指出。 –
運行'gcc -v main.c'來查看編譯器實際運行的命令。請注意,它爲'ld'運行的命令行要比給出的命令行復雜得多。 –
海灣合作委員會極其冗長的'ld'論點並不總是強制性的。一個簡單的'Hello,world'程序只能與'ld -lc -lkernel32 src.o -o src.exe'完全鏈接。 –
@RyanB我得到「找不到-lc」。 –