Ошибка компиляции программы - сбой библиотеки Maths?

У меня есть версия Ubuntu 16.04.3 LTS сервера Ubuntu (без GIU) и попытка установить программу 'parsefsh-1.0-g231'.

Я скачал файл и распаковал его нормально, теперь мне нужно скомпилировать его, поэтому попытался «сделать», но получил следующую ошибку ..

gcc -Wall -Wextra -g -std=gnu99 -DHAVE_VLOG   -c -o projection.o projection.c
gcc -lm  parsefsh.o fshfunc.o projection.o   -o parsefsh
projection.o: In function `init_ellipsoid':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:51: undefined reference to `pow'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:51: undefined reference to `sqrt'
projection.o: In function `phi_rev_merc':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:66: undefined reference to `sin'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:67: undefined reference to `exp'
projection.o: In function `northing':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:95: undefined reference to `tan'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:95: undefined reference to `sin'
projection.o: In function `coord_diff':
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:111: undefined reference to `cos'
/home/ian/parsefshsrc/parsefsh-1.0-g231/projection.c:113: undefined reference to `atan2'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'parsefsh' failed
make: *** [parsefsh] Error 1

(было больше строк с различными математическими функциями, но я удалил их, чтобы сократить это сообщение)

На мой взгляд, No0b смотрит на проблему с математическими функциями, я сделал несколько Поиск в Интернете и была найдена рекомендация попробовать следующее ...

gcc projection.c -o projection.o -lm

, но это дает мне ошибку

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

Теперь я застрял и не могу найти другие ответы в Интернете, кто-нибудь может помочь, пожалуйста?

1
задан 12 July 2019 в 11:06

2 ответа

Ваше исследование привело Вас вдоль правильных строк.

Исследование Make-файла программного обеспечения показывает что правила для создания цели parsefish

parsefsh: parsefsh.o fshfunc.o projection.o

parsefsh.o: parsefsh.c fshfunc.h

fshfunc.o: fshfunc.c fshfunc.h

projection.o: projection.c projection.h

Поскольку нет никаких явных действий для этих правил, GNU Делают использование его встроенными правилами. Для фазы компиляции (.c кому: .o) это

$(CC) $(CPPFLAGS) $(CFLAGS) -c

который хорошо работает, учитывая определения Make-файла

CC = gcc
CFLAGS = -Wall -Wextra -g -std=gnu99 -DHAVE_VLOG

однако в фазе ссылки, правило имеет форму

$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

Отметьте это $(LDFLAGS) прибывает перед файлом объектного кода n.o, тогда как $(LOADLIBES) и $(LDLIBS) приезжайте после. В Make-файле, только LDFLAGS определяется:

LDFLAGS = -lm

который помещает -lm в неправильном месте (ссылки разрешены слева направо).

Простое решение состоит в том, чтобы просто измениться LDFLAGS = -lm кому: LDLIBS = -lm.

0
ответ дан 7 December 2019 в 19:34

Wowser, который работает! крайне благодарным! Я собирался начать писать свою собственную программу в Python или VB, чтобы сделать то же задание - Вы сохранили меня 10-е часов работы - возможно 100's!

Я прочитал Ваше объяснение и сумел следовать за ним большая часть пути, мне любопытно однако - так как программе несколько лет и существует довольно много версий его, я удивлен, что существует так мало шума о сбое компиляции в Интернете, оно заставляет меня думать, что оно раньше компилировало прекрасный, но теперь не делает - там было бы изменение в процессе компиляции за несколько прошлых лет, которые могли бы вызвать это?

0
ответ дан 7 December 2019 в 19:34

Другие вопросы по тегам:

Похожие вопросы: