Question

After a long time, I downloaded a program I co-developed and tried to recompile it on my Ubuntu Linux 12.04, but it seems it does not find math.h anymore. This may be because something has changed recently in gcc, but I can't figure out if it's something wrong in src/Makefile.am or a missing dependency:

Download from 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

I get: [...]

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

The libraries are there because this simple example works perfectly well:

$ 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;
}

Any ideas?

Était-ce utile?

La solution

The library needs to go at the end of the compiler command, as you have in the simple example:

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

From GCC Link Options:

-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.

Autres conseils

It seems like this simple change would suffice in Makefile.am:

+variscan_LDADD = -lm
-variscan_LDFLAGS = -lm
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top