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

C &引用;对“pow'”的未定义引用&引用;即使使用math.h和库链接-lm,c,linux,math,gcc,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' 发生在所有情况下。将-lm放在行的末尾 gcc处理指定最终程序输入的参数,这些参数按它们在命令行上出现的顺序进行处理。-lm参数被传递给链接器,例如,ssf.c

我正在使用
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
指定的那样,它会查看该库是否提供链接器当前需要的任何符号。如果是这样,它将从库中复制带有这些符号的模块,并将它们构建到程序中。当链接器看到一个对象模块时,它将该对象模块构建到程序中。将对象模块引入程序后,链接器不会返回并查看是否需要早期库中的任何内容


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

你能发布这3个命令行中的
ssf_tb.c
gcc-o-lm ssf-lm ssf_tb.c ssf.c
吗?只有第一个命令行可以工作。你确定你试过了吗?对不起,第三行是我的错。是的,我尝试了所有这些组合。请将问题简化为a。谢谢Eric的解释。我想我在命令末尾使用
-lm
解决了这个问题。我不知道怎么做,但我的数学库链接在
/usr/src/mathematics/math.h
中。我将它重新编译为/usr/include/math.h,它成功了@user2344169在你的帖子里,你不是说你已经试过了吗?OP可能已经试过了,但这是我需要的提示,谢谢。