一尘不染

即使使用math.h和库链接-lm也“未定义对'pow'的引用”

linux

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

在所有情况下都会发生。


阅读 350

收藏
2020-06-02

共1个答案

一尘不染

将放在-lm行尾。

gcc按照在命令行上出现的顺序处理为最终程序指定输入的参数。该-lm参数被传递给链接器和ssf.c参数,例如,被编译,并且将所得的目标文件被传递给链接器。

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

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

2020-06-02