10

我正在使用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'  

发生在所有情况下。

4

1 回答 1

30

将 放在-lm行尾。

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

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

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

于 2013-05-02T17:48:25.587 回答