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