Программа больше не найдет math.h
Спустя долгое время я скачал программу, которую я разработал, и попытался перекомпилировать ее на своем Ubuntu Linux 12.04, но, похоже, он больше не находит math.h. Это может быть потому, что что-то недавно изменилось в gcc
, но я не могу понять, если что-то не так в src/Makefile.am
или отсутствующая зависимость:
Скачать с http://www.ub.edu/softevol/variscan/:
tar xzf variscan-2.0.2.tar.gz
cd variscan-2.0.2/
make distclean
sh ./autogen.sh
make
Я получил: [...]
gcc -DNDEBUG -O3 -W -Wall -ansi -pedantic -lm -o variscan variscan.o statistics.o common.o linefile.o memalloc.o dlist.o errabort.o dystring.o intExp.o kxTok.o pop.o window.o free.o output.o readphylip.o readaxt.o readmga.o readmaf.o readhapmap.o readxmfa.o readmav.o ran1.o swcolumn.o swnet.o swpoly.o swref.o
statistics.o: In function `calculate_Fu_and_Li_D':
statistics.c:(.text+0x497): undefined reference to `sqrt'
statistics.o: In function `calculate_Fu_and_Li_F':
statistics.c:(.text+0x569): undefined reference to `sqrt'
statistics.o: In function `calculate_Fu_and_Li_D_star':
statistics.c:(.text+0x63b): undefined reference to `sqrt'
statistics.o: In function `calculate_Fu_and_Li_F_star':
statistics.c:(.text+0x75c): undefined reference to `sqrt'
statistics.o: In function `calculate_Tajima_D':
statistics.c:(.text+0x85d): undefined reference to `sqrt'
statistics.o:statistics.c:(.text+0xcb1): more undefined references to `sqrt' follow
statistics.o: In function `calcRunMode21Stats':
statistics.c:(.text+0xe02): undefined reference to `log'
statistics.o: In function `correctedDivergence':
statistics.c:(.text+0xe5a): undefined reference to `log'
statistics.o: In function `calcRunMode22Stats':
statistics.c:(.text+0x104a): undefined reference to `sqrt'
statistics.o: In function `calculate_Fu_fs':
statistics.c:(.text+0x11a8): undefined reference to `fabsl'
statistics.c:(.text+0x11ca): undefined reference to `powl'
statistics.c:(.text+0x11f2): undefined reference to `logl'
statistics.o: In function `calculateStatistics':
statistics.c:(.text+0x13f2): undefined reference to `log'
collect2: ld returned 1 exit status
make[1]: *** [variscan] Error 1
make[1]: Leaving directory `/home/avilella/variscan/latest/variscan-2.0.2/src'
make: *** [all-recursive] Error 1
Библиотеки есть, потому что этот простой пример отлично работает:
$ gcc test.c -o test -lm
$ cat test.c
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 0.5;
double result = sqrt(x);
printf("The hyperbolic cosine of %lf is %lf\n", x, result);
return 0;
}
Есть идеи?
2 ответа
Библиотека должна идти в конце команды компилятора, как в простом примере:
gcc -DNDEBUG -O3 -W -Wall -ansi -pedantic -o variscan variscan.o statistics.o common.o linefile.o memalloc.o dlist.o errabort.o dystring.o intExp.o kxTok.o pop.o window.o free.o output.o readphylip.o readaxt.o readmga.o readmaf.o readhapmap.o readxmfa.o readmav.o ran1.o swcolumn.o swnet.o swpoly.o swref.o statistics.o -lm
Из GCC Link Options:
-llibrary -l библиотека Поиск библиотеки по имени библиотеки при связывании. (Второй вариант с библиотекой в качестве отдельного аргумента только для соответствия POSIX и не рекомендуется.) Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в порядок они указаны. Таким образом, `foo.o -lz bar.o'ищет библиотеку`z' после файла foo.o, но до бара Если bar.o ссылается на функции в `z', эти функции не может быть загружен.
Кажется, что этого простого изменения будет достаточно в Makefile.am
:
+variscan_LDADD = -lm
-variscan_LDFLAGS = -lm