我正在使用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'
发生在所有情况下。
将 放在-lm
行尾。
gcc 按照它们在命令行中出现的顺序处理指定最终程序输入的参数。-lm
参数被传递给链接器,ssf.c
例如,参数被编译,生成的目标文件被传递给链接器。
链接器还按顺序处理输入。当它看到指定的库时,它会查看该库是否提供了链接器当前需要的-lm
任何符号。如果是这样,它会从库中复制带有这些符号的模块并将它们构建到程序中。当链接器看到一个目标模块时,它会将该目标模块构建到程序中。在将目标模块引入程序后,链接器不会返回查看它是否需要早期库中的任何内容。
因为您首先列出了库,所以链接器没有从库中看到它需要的任何内容。如果首先列出目标模块,链接器会将目标模块带入程序。在执行此操作的过程中,链接器将列出对象所需的所有未定义符号。然后,当链接器看到库时,它会看到库提供了这些符号的定义,并将带有这些符号的模块带入程序中。