C: Неопределенная ссылка на пол

Я использую Eclipse в Ubuntu для написания / компиляции / запуска кода C. Я пытаюсь построить свой проект. Ниже приведен вывод в консоли Eclipse.

22:18:31 **** Build of configuration Debug for project Project1 ****
make all 
Building file: ../project1.c
Invoking: GCC C Compiler
gcc -I/lib/i386-linux-gnu -O0 -g3 -Wall -c -fmessage-length=0 -pthread -lm -MMD -MP -MF"project1.d" -MT"project1.d" -o "project1.o" "../project1.c"
../project1.c: In function ‘main’:
../project1.c:146:6: warning: unused variable ‘this_thread_id’ [-Wunused-variable]
../project1.c: In function ‘_pre_init’:
../project1.c:126:1: warning: control reaches end of non-void function [-Wreturn-type]
Finished building: ../project1.c

Building file: ../scheduler.c
Invoking: GCC C Compiler
gcc -I/lib/i386-linux-gnu -O0 -g3 -Wall -c -fmessage-length=0 -pthread -lm -MMD -MP -MF"scheduler.d" -MT"scheduler.d" -o "scheduler.o" "../scheduler.c"
Finished building: ../scheduler.c

Building target: Project1
Invoking: GCC C Linker
gcc -L/lib/i386-linux-gnu -lm -pthread -o "Project1"  ./project1.o ./scheduler.o   
./project1.o: In function `advance_global_time':
/home/akshay/Cworkspace/Project1/Debug/../project1.c:50: undefined reference to `floor'
collect2: ld returned 1 exit status
make: *** [Project1] Error 1

Может ли кто-нибудь помочь мне разобраться, в чем проблема и как ее решить?


person Akshay7589    schedule 07.02.2013    source источник
comment
Как вы добавили математическую библиотеку? См. этот мой старый ответ для возможного решения.   -  person Some programmer dude    schedule 07.02.2013
comment
возможный дубликат Неопределенной ссылки на 'pthread_create'   -  person Jonathan Leffler    schedule 07.02.2013


Ответы (3)


Библиотеки нужно связывать после объектных файлов.

У вас есть:

gcc -L/lib/i386-linux-gnu -lm -pthread -o "Project1"  ./project1.o ./scheduler.o   

Тебе нужно:

gcc -L/lib/i386-linux-gnu -pthread -o "Project1"  ./project1.o ./scheduler.o -lm 

Похоже, что произошли изменения в том, как работают компоновщики - в какое-то время можно было указать разделяемые библиотеки (например, математическую библиотеку) перед объектными файлами, и все это будет работать. Однако в настоящее время, если общая библиотека не удовлетворяет никаким символам при сканировании, она исключается из процесса связывания. Убедитесь, что объектные файлы перечислены до того, как библиотеки исправят это.

См. Также Неопределенная ссылка на 'pthread_create'; та же проблема, то же решение. И я сомневаюсь, что это единственный такой вопрос в SO.

person Jonathan Leffler    schedule 07.02.2013

Вам нужно связать с математической библиотекой, то есть добавить -lm в конце строки ссылки. Не знаю, как это сделать в Eclipse, извините.

person vonbrand    schedule 07.02.2013

Обратите внимание: флаги связывания в вашем выводе выглядят не по порядку. Возможно, вы пытались добавить -lm через флаги компоновщика в Eclipse. Это вызывает проблемы в Eclipse. Предлагаю вам попробовать ...

Щелкните правой кнопкой мыши свой проект -> свойства -> C / C ++ Build -> Settings -> GCC Linker -> Libraies -> добавьте "m" -> Apply -> build.

ИЛИ в самом списке убедитесь, что параметры -L и -l идут после ваших файлов .o в процессе связывания.

Меня это только что поразило сегодня, и на какое-то время это ускользнуло от меня.

person Andrew White    schedule 07.02.2013
comment
«Щелкните правой кнопкой мыши свой проект -› Свойства - ›C / C ++ Build -› Настройки - ›GCC Linker -› Libraies - ›add m -› Apply - ›build». Благодаря тонну! - person Akshay7589; 07.02.2013