2012-03-14 20 views
5

MinGW kullanıyorum. Malloc ve diğer birkaç genel işlevini çağıran bir kodum var. Yazdığımda:MinGW undefined başvuru malloc, ücretsiz, sprintf, _beginthreadex

gcc TestCode.c 

Bir a.exe dosyası alıyorum, mükemmel çalışıyor ve herhangi bir uyarı almıyorum. Bunu yazarsanız

:

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' 

Biliyorum bu bağlayıcı çağırıyorum nasıl bir sorun olduğunu tahmin ediyorum:

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

ben gibi uyarılar bir sürü olsun. Bu nedenle, yalnızca sorunun ne olduğu net değilse kodu yayınlayacağım. Ben bu kolay bir düzeltme olduğunu ve sadece bağlantı yaparken bazı süper açık kütüphane dahil etmeyi unuttuğumu umuyorum.

+1

olası yinelemesi [MinGW derleyicisini kullanırken bağlantı hatası (bulamıyorum __main)] (http://stackoverflow.com/questions/4981826/link-error-while-using-mingw-compiler-cant-find- ana) –

cevap

7

ld ürününüzün varsayılan olarak herhangi bir kütüphaneye bağlanmadığı anlaşılıyor. Hata iletilerinizden en az C çalışma zamanına ve libc'a ihtiyacınız olduğu anlaşılıyor. sizin için bağlantılı bazı kullanışlı varsayılan almak bağlamak gcc kullanın:

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

Eğer gerçekten, kendi C çalışma zamanı kütüphane ve libc'nin isimlerini anlamaya ihtiyacımız olacak doğrudan ld kullanmak istiyorsanız . Örneğin (libcrt adlandırılır ve libc kütüphaneleri varsayarak):

ld *.o -lcrt -lc 
+1

Yön için teşekkürler! Ld'imde -lmsvcrt bayrağını ekleyerek çalışmayı başarabildim. Bize tavsiye için teşekkürler doğrudan ld kullanarak uzaklaşın, bunlarla için maalesef proje inşa çok büyük olabilir! – Brett

+0

Gcc'nin linker için bir ön uç olarak kullanılması herhangi bir fark yaratmamalıdır. "Sizin' ld' kullanarak uzaklaşmaya için çok büyük" Ne demek? –

1

Carl Norum said olarak, gcc nesne dosyaları geçebilir ve bunları derlemek gerekmez bileceksiniz - sadece bağlayıcı onları geçer (aynı kaynakta başka kaynak dosyaları derleyip topluyor olsanız da olmasın).

Ve gerektiğini muhtemelen yapmak (varsayılan çalışma zamanını kullanmayacak şekilde çok özel bir gerek olmadıkça) CRT ve pencereler destek kütüphanelerde bağlama gider ayrıntı adil bir miktar var, çünkü. Benim nesne dosyaları ile birlikte aşağıdaki öğeler Benim şu anki MinGW kurulum bağlantıları:

crt2.o 
crtbegin.o 

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

crtend.o 

nasıl sizin için gcc bağlantıları görmek için --verbose seçeneğini kullanın.