编译器说,即使我使用-lm链接,但未定义pow,但编译时

时间:2013-02-05 23:49:57

标签: c compiler-construction linker math.h

value *= pow(10, 3); // this one compiles
value *= pow(10, aVar); // this one produces this error:
                         //Number.c:(.text+0x469): undefined reference to `pow'

aVar是一个int变量。

它可能是什么?

我正在使用makefile。 我擅长“制造lexanc” 我的makefile看起来像这样:

lexanc:  lexandr.o lexanc.o scanner.o printtoken.o token.h lexan.h Number.o
    cc -o lexanc -lm lexandr.o lexanc.o scanner.o printtoken.o Number.o
...
Number.o: Number.c Number.h lexan.h
    cc -c Number.c

lexanc.o: lexanc.c token.h lexan.h Number.h
    cc -c lexanc.c
...

我的cc版本是: laygr @ xxx $ cc - 版本 cc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3

2 个答案:

答案 0 :(得分:6)

库应该位于编译选项中的所有对象之后。将其更改为:

lexanc:  lexandr.o lexanc.o scanner.o printtoken.o token.h lexan.h Number.o
    cc -o lexanc lexandr.o lexanc.o scanner.o printtoken.o Number.o -lm

注意-lm已移至最后。

答案 1 :(得分:2)

你是否包括math.h?尝试将-Wall -ansi -pedantic作为命令行参数添加到C编译器。为此目的,通常会在某处定义CFLAGS

修改
这实际上是我完全忘记的常见问题。将-lm移动到参数列表的末尾。更具体地说,它需要在之后所有对象。有关详细信息,请查看answers to this question