У меня есть версия 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
Теперь я застрял и не могу найти другие ответы в Интернете, кто-нибудь может помочь, пожалуйста?
Ваше исследование привело Вас вдоль правильных строк.
Исследование 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
.
Wowser, который работает! крайне благодарным! Я собирался начать писать свою собственную программу в Python или VB, чтобы сделать то же задание - Вы сохранили меня 10-е часов работы - возможно 100's!
Я прочитал Ваше объяснение и сумел следовать за ним большая часть пути, мне любопытно однако - так как программе несколько лет и существует довольно много версий его, я удивлен, что существует так мало шума о сбое компиляции в Интернете, оно заставляет меня думать, что оно раньше компилировало прекрасный, но теперь не делает - там было бы изменение в процессе компиляции за несколько прошлых лет, которые могли бы вызвать это?