【问题标题】:"undefined reference to `pow'" even with math.h and the library link -lm [duplicate]“未定义的对‘pow’的引用”即使使用 math.h 和库链接 -lm [重复]
【发布时间】:2013-05-02 17:44:59
【问题描述】:

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

发生在所有情况下。

【问题讨论】:

  • 可以发ssf_tb.c的代码吗?
  • gcc -o -lm ssf -lm ssf_tb.c ssf.c -lm 两次?
  • 在这 3 个命令行中,只有第一个可以工作。你确定你试过了吗?
  • 对不起我在第三行的错。是的,我尝试了所有这些组合。
  • 请将问题简化为self-contained, compilable example

标签: c linux math gcc


【解决方案1】:

-lm 放在行尾。

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

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

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

【讨论】:

  • 感谢埃里克的解释。我想我在命令末尾使用-lm 解决了这个问题。我不知道怎么做,但我的数学库链接在/usr/src/mathematics/math.h。我将它重建到 /usr/include/math.h 并且它起作用了!
  • @user2344169 在你的帖子里你不是说你已经试过了吗?
  • OP 可能已经尝试过了,但这是 需要的提示,谢谢。
猜你喜欢
  • 2013-04-27
  • 2020-04-17
  • 2012-01-19
  • 1970-01-01
  • 2015-02-13
  • 2012-09-20
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多