программа больше не находит 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;
}

Любые идеи?


person 719016    schedule 09.07.2012    source источник
comment
Он находит заголовок, но не библиотеку или, по крайней мере, не символы, которые ищет. Что произойдет, если вы попробуете эти две команды в своем тестовом файле? gcc -DNDEBUG -O3 -W -Wall -ansi -pedantic -lm -o test.o -c test.c и gcc -DNDEBUG -O3 -W -Wall -ansi -pedantic -lm -o test test.o? Может быть, переменная среды неверна при запуске make?   -  person Matt K    schedule 09.07.2012
comment
Я получаю точно такую ​​же ошибку во время make.   -  person flak37    schedule 09.07.2012
comment
@mkb вторая команда работает, первая не работает с этой ошибкой: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat]   -  person 719016    schedule 09.07.2012
comment
Попробуйте скомпилировать его, поставив -lm последним. Некоторые компоновщики обрабатывают флаг -l, просматривая все символы, найденные до этого момента; другие обрабатывают его, добавляя в список библиотек, которые ищутся в конце. Я не могу вспомнить, каким образом gcc делает это, но если вы хотите, чтобы ваш код был вообще переносимым между компиляторами, вы должны принять более консервативное поведение и поставить -lm последним.   -  person Norman Gray    schedule 09.07.2012
comment
Как изменить src/Makefile.am, чтобы добавить -lm в конце? Если я сделаю это вручную, это все равно не сработает, поэтому я с @mkb здесь, что должно быть что-то еще.   -  person 719016    schedule 09.07.2012


Ответы (2)


Библиотека должна идти в конце команды компилятора, как в простом примере:

gcc -DNDEBUG -O3 -W -Wall -ansi -pedantic -o variscan variscan.o статистика.o common.o linefile.o memalloc.o dlist.o errabort.o Dystring.o intExp.o kxTok.o всплывающее окно. .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 статистика.o -lm

Из параметров ссылок GCC:

-llibrary
-l library
    Search the library named library when linking. 
    (The second alternative with the library as a separate argument
    is only for POSIX compliance and is not recommended.)

    It makes a difference where in the command you write this option;
    the linker searches and processes libraries and object files in the
    order they are specified.
    Thus, `foo.o -lz bar.o' searches library `z' after file foo.o but
    before bar.o. If bar.o refers to functions in `z', those functions
    may not be loaded.
person hmjd    schedule 09.07.2012
comment
перемещение -lm -o variscan в конец строки сработало, но я не знаю, как изменить это в src/Makefile.am, чтобы сделать его автоматическим. - person 719016; 09.07.2012

Кажется, что этого простого изменения будет достаточно в Makefile.am:

+variscan_LDADD = -lm
-variscan_LDFLAGS = -lm
person 719016    schedule 09.07.2012
comment
Библиотеки не принадлежат LDFLAGS. Они относятся к отдельной переменной, которая будет находиться в конце командной строки компоновщика, часто называемой LIBS. Я забыл, какое имя предпочитает automake. - person R.. GitHub STOP HELPING ICE; 09.07.2012