2015-12-23 3 views
0

Я пытался скомпилировать некоторый код, который позволит мне преобразовать gcode в x3g для моего 3D-принтера, но он бросает мне следующее, когда я пытаюсь запустить ' делать.'undefined ссылка на 'sqrt' при попытке использовать команду make

sudo make 
[sudo] password for kipinaac: 
cc -c -w getopt.c -o getopt.o 
cc -c -w gpx.c -o gpx.o 
cc -c -w gpx-main.c -o gpx-main.o 
cc -lm getopt.o gpx.o gpx-main.o -o gpx 
gpx.o: In function `magnitude': 
gpx.c:(.text+0x1c1f): undefined reference to `sqrt' 
gpx.o: In function `mm_to_steps': 
gpx.c:(.text+0x224d): undefined reference to `round' 
gpx.c:(.text+0x2274): undefined reference to `round' 
gpx.c:(.text+0x229b): undefined reference to `round' 
gpx.c:(.text+0x22ef): undefined reference to `round' 
gpx.c:(.text+0x2353): undefined reference to `round' 
gpx.o:gpx.c:(.text+0x2397): more undefined references to `round' follow 
collect2: error: ld returned 1 exit status 
make: *** [gpx] Error 1 

Я проверил, что есть ссылка в пределах gpx.c тоже. Я понял, что это может быть связано с привязкой к другим потокам, но все они явно называют gcc, а не используют make. Кроме того, чтобы быть ясным, уже есть Makefile.

+1

Библиотеки ('-lm') после объектных файлов. Переместите '-lm' до конца, и все будет в порядке. –

+0

Я отредактировал Makefile, чтобы включить библиотеки после объектных файлов, и он скомпилирован правильно. Файл Makefile был предоставлен в Github, и было много видеороликов, показывающих успешные установки, поэтому что-то говорит мне, что он должен был работать без этого шага. Есть идеи? – akp234

+0

Он работал только случайно - некоторые версии GCC и его компоновщик заметят содержимое библиотек, перечисленных перед любыми объектными файлами; другие (включая ваши) будут использовать библиотеку только в том случае, если она поставляет какие-либо символы, которые ей нужны, в момент их сканирования. Когда библиотека находится перед объектными файлами, она не удовлетворяет единственному символу, который ищет компоновщик - 'main' - поэтому он игнорируется как несущественный. Единственный безопасный способ работы - «библиотеки после объектных файлов». Это работает со статическими и разделяемыми библиотеками с обоими стилями компоновщика. –

ответ

0

Передача комментариев для ответа, чтобы закрыть вопрос.

Поместить библиотеки (-lm) после объектных файлов в командной строке. Переместите -lm до конца, и все будет в порядке.

Я отредактировал Makefile, чтобы включить библиотеки после объектных файлов и скомпилирован правильно. Файл Makefile был предоставлен в Github, и было много видеороликов, показывающих успешные установки, поэтому что-то говорит мне, что он должен был работать без этого шага. Есть идеи?

Это только сработало случайно - некоторые версии GCC и его компоновщик заметят содержимое библиотек, перечисленных перед любыми объектными файлами; другие (включая ваши) будут использовать библиотеку только в том случае, если она поставляет какие-либо символы, которые ей нужны, в момент их сканирования. Когда библиотека находится перед объектными файлами, она не удовлетворяет единственному символу, который ищет компоновщик - main - поэтому он игнорируется как несущественный. Единственный безопасный способ работы - «библиотеки после объектных файлов». Это работает со статическими и разделяемыми библиотеками с обоими стилями компоновщика.