“未定义引用`pow'”,即使是math.h和库链接-lm

时间:2013-05-02 17:44:59

标签: c linux math gcc

我正在使用math.h-lm选项进行编译。我尝试了所有:

gcc -o ssf ssf_tb.c ssf.c -lm
gcc -o ssf ssf_tb.c -lm ssf.c   
gcc -o -lm ssf -lm ssf_tb.c ssf.c

但错误:

undefined reference to 'pow'  

发生在所有情况下。

1 个答案:

答案 0 :(得分:27)

-lm放在行尾。

gcc按照它们在命令行中出现的顺序处理指定最终程序输入的参数。 -lm参数传递给链接器,例如,编译ssf.c参数,并将生成的目标文件传递给链接器。

链接器还按顺序处理输入。当它看到一个库时,如-lm所指定的那样,它会查看该库是否提供链接器当前需要的符号。如果是这样,它将使用库中的那些符号复制模块并将它们构建到程序中。当链接器看到对象模块时,它会将该对象模块构建到程序中。将目标模块引入程序后,链接器不会返回并查看它是否需要来自早期库的任何内容。

因为您首先列出了库,所以链接器没有从库中看到它需要的任何内容。如果首先列出目标模块,链接器将把对象模块带入程序。在执行此操作的过程中,链接器将列出对象所需的所有未定义符号。然后,当链接器看到库时,它将看到库提供这些符号的定义,并且它将带有这些符号的模块带入程序。