2012-03-14 108 views
5

我正在使用MinGW。我有一些調用malloc和一些其他通用函數的代碼。當我輸入:MinGW未定義的引用malloc,free,sprintf,_beginthreadex

gcc TestCode.c 

我得到一個a.exe文件,它工作的很完美,我沒有收到任何警告。

如果我輸入:

gcc -c TestCode.c -o TestCode.o 
ld *.o 

我收到了一大堆警告,如:

TestCode.o:TestCode.c:(.text+0xa): undefined reference to `__main' 
TestCode.o:TestCode:(.text+0x2e): undefined reference to `printf' 
TestCode.o:TestCode:(.text+0x42): undefined reference to `_strerror' 
TestCode.o:TestCode:(.text+0x69): undefined reference to `snprintf' 
TestCode.o:TestCode:(.text+0x7e): undefined reference to `malloc' 
TestCode.o:TestCode:(.text+0x93): undefined reference to `_strerror' 
TestCode.o:TestCode:(.text+0xb1): undefined reference to `sprintf' 
TestCode.o:TestCode:(.text+0xcf): undefined reference to `free' 

我假設這是我如何調用該鏈接的問題。因此,如果不清楚問題是什麼,我只會發布代碼。我希望這是一個簡單的解決方法,並且我簡單地在鏈接時忘記了包含一些超級明顯的庫。

+1

可能重複[使用MinGW編譯器時發生鏈接錯誤(無法找到__main)](http://stackoverflow.com/questions/4981826/link-error-while-using-mingw-compiler-cant-find-主) – 2012-03-14 03:25:29

回答

7

看起來您的ld默認情況下不鏈接任何庫。從你的錯誤信息看來,你至少需要C運行時和libc。使用gcc鏈接以獲得鏈接在一些方便的默認設置爲您:

gcc -c TestCode.c -o TestCode.o 
gcc *.o 

如果你真的使用ld直接,你將需要弄清楚你的C運行時庫和libc中的名字。例如(假設庫名爲libcrtlibc):

ld *.o -lcrt -lc 
+1

感謝您的指導!我能夠通過在我的ld中包含-lmsvcrt標誌來使其工作。不幸的是,項目構建可能太大,我們不能直接使用ld,但感謝您的建議! – Brett 2012-03-14 03:31:12

+0

使用gcc作爲鏈接器的前端應該沒有任何區別。你的意思是「太大了,不願意使用'ld'」? – 2012-03-14 03:55:42

1

由於Carl Norum said,您可以目標文件傳遞給gcc,它會知道它不需要編譯它們 - 它只是將它們傳遞給鏈接器(不管你是否在同一個調用中編譯其他源文件)。

而你應該這樣做,因爲在CRT和Windows支持庫中有相當多的細節進入鏈接(除非你有一個非常特殊的需要不使用默認運行時)。在我的對象文件一起以下項目我目前的MinGW的設置鏈接:

crt2.o 
crtbegin.o 

-ladvapi32 
-lshell32 
-luser32 
-lkernel32 
-lmingw32 
-lgcc 
-lmoldname 
-lmingwex 
-lmsvcrt 

crtend.o 

使用--verbose選項,看看你gcc鏈接。

相關問題