MinGW неопределенная ссылка на malloc, free, sprintf, _beginthreadex - PullRequest
5 голосов
/ 14 марта 2012

Я использую MinGW.У меня есть некоторый код, который вызывает malloc и несколько других функций общего назначения.Когда я набираю:

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'

Я предполагаю, что это проблема с тем, как я вызываю компоновщик.Поэтому я выложу код, только если неясно, в чем проблема.Я надеюсь, что это легко исправить, и я просто забыл включить какую-то супер очевидную библиотеку при компоновке.

Ответы [ 2 ]

7 голосов
/ 14 марта 2012

Похоже, что ваш ld не связывает библиотеки по умолчанию. Судя по вашим сообщениям об ошибках, вам нужно хотя бы время выполнения C и libc. Используйте gcc, чтобы связать, чтобы получить некоторые удобные настройки по умолчанию для вас:

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

Если вы действительно хотите использовать ld напрямую, вам нужно выяснить имена вашей библиотеки времени выполнения C и libc. Например (предполагается, что библиотеки с именами libcrt и libc):

ld *.o -lcrt -lc
1 голос
/ 14 марта 2012

Как сказал Карл Норум , вы можете передавать объектные файлы в gcc, и он будет знать, что им не нужно их компилировать - он просто передает их компоновщику (независимо от того, компилируете другие исходные файлы в тот же вызов).

И вам, вероятно, следует сделать это, потому что в связке в CRT и библиотеках поддержки Windows достаточно много деталей (если у вас нет особой необходимости не использовать среду выполнения по умолчанию). Моя текущая установка MinGW содержит ссылки на следующие элементы вместе с моими объектными файлами:

crt2.o
crtbegin.o

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

crtend.o

Используйте параметр --verbose, чтобы увидеть, как gcc ссылки для вас.

...