2012-03-14 12 views
5

Sto usando MinGW. Ho del codice che chiama malloc e alcune altre funzioni di scopo generale. Quando digito:MinGW riferimento undefined a malloc, free, sprintf, _beginthreadex

gcc TestCode.c 

Ottengo un file a.exe, funziona perfettamente e non ricevo alcun avviso.

Se scrivo questo:

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

ottengo un sacco di avvertimenti come:

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' 

sto assumendo questo è un problema di come sto chiamando il linker. In quanto tale, inserirò il codice solo se non è chiaro quale sia il problema. Spero che questa sia una soluzione semplice e che ho semplicemente dimenticato di includere alcune librerie super-evidenti durante il collegamento.

+1

possibile duplicato di [Errore di collegamento durante l'utilizzo del compilatore MinGW (impossibile trovare __main)] (http://stackoverflow.com/questions/4981826/link-error-while-using-mingw-compiler-cant-find- main) –

risposta

7

Sembra che il tuo ld non colleghi alcuna libreria per impostazione predefinita. Dai tuoi messaggi di errore, sembra che sia necessario almeno il runtime C e libc. Utilizzare gcc a collegare per ottenere alcuni valori di default a portata di mano collegate in per voi:

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

Se davvero desidera utilizzare ld direttamente, si sta andando ad avere bisogno di capire i nomi della vostra libreria di runtime C e libc . Per esempio (supponendo che le librerie di nome libcrt e libc):

ld *.o -lcrt -lc 
+1

Grazie per la direzione! Sono riuscito a farlo funzionare includendo la flag -lmsvcrt sul mio ld. Sfortunatamente, la costruzione del progetto potrebbe essere troppo grande per permetterci di allontanarci dall'utilizzo di LD direttamente, ma grazie per il consiglio! – Brett

+0

L'uso di gcc come front-end per il linker non dovrebbe fare alcuna differenza. Cosa intendi per "troppo grande per il tuo per allontanarti dall'uso di' ld' "? –

1

Come Carl Norum said, è possibile passare i file oggetto per gcc e si metterà a sapere che non ha bisogno di compilare loro - semplicemente li passa al linker (indipendentemente dal fatto che tu stia compilando o meno altri file sorgente nella stessa invocazione).

E probabilmente dovresti farlo perché c'è una buona quantità di dettagli che collegano le librerie CRT e Windows (a meno che tu non abbia una necessità specifica di non utilizzare il runtime predefinito). I miei attuali collegamenti di impostazione MinGW nei seguenti oggetti lungo con i miei file oggetto:

crt2.o 
crtbegin.o 

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

crtend.o 

Utilizzare l'opzione --verbose per vedere come gcc link per voi.