对sqrt未定义的引用 matlab,关于C#:对sqrt(或其他数学函数)的未定义引用

这篇博客讨论了在C编程中遇到的链接错误,即未定义的sqrt引用。作者指出,尽管包含了math.h头文件,但还需要在编译命令中添加-lm选项以链接数学库。博客提到了编译器和链接器的角色,以及某些编译系统对库链接顺序的敏感性。解决方案是确保在编译命令中正确地添加了-lm选项。
摘要由CSDN通过智能技术生成

我有这个简单的代码:

max = (int) sqrt (number);

在标题中我有:

#include

但是应用程序仍然会对sqrt进行未定义的引用。 你觉得这里有什么问题吗? 看起来一切都应该没问题。

哪个抱怨,链接器或编译器? 如果你可以发布可能清除的确切错误。

编译器写这个抱怨,问题是,该应用程序甚至没有建立...

问题不在您的程序中,而是在C库的系统实现中。 它仍然遵循20世纪70年代/ 80年代的遗留惯例,其中数学函数位于单独的库中,默认情况下不链接。

您可能会发现必须在您使用的任何系统上链接数学库,例如:

gcc -o myprog myprog.c -L/path/to/libs -lm

^^^ - this bit here.

包含头文件允许编译器了解函数声明,但它不一定自动链接到执行该函数所需的代码。

如果做不到这一点,您需要向我们展示您的代码,编译命令以及您正在运行的平台(操作系统,编译器等)。

以下代码编译并链接正常:

#include

int main (void) {

int max = sqrt (9);

return 0;

}

请注意,某些编译系统依赖于命令行中给定库的顺序。由此,我的意思是他们可以按顺序处理库,只使用它们来满足序列中该点的未解析符号。

因此,例如,给定命令:

gcc -o plugh plugh.o -lxyzzy

gcc -o plugh -lxyzzy plugh.o

并且plugh.o需要来自xyzzy库的内容,第二个可能无法按预期工作。在列出库的位置,没有未满足的未解析符号。

当来自plugh.o的未解析符号出现时,为时已晚。

sry,我写的很糟糕,确定它包括...问题是,那个app甚至没有建成......

我已经通过构建加入了 - 现在我有另外的错误,但这已经解决了!谢谢

@paxdiablo:对于csqrt的Clibc?

@ user2284570,听起来好像最好发布一个问题("如何在uClibc的数学库中链接?"或类似的东西)。比评论更多的人会看到一个问题。

还要注意链接库的顺序。我发现Ive在命令行中过早 - 并且将其移动到最后解决了相关的错误消息。这似乎也依赖于gcc版本(一些旧版本并不介意)。

好的指针@KevinBullaughey我还必须将另一个链接选项移到后面(-lpthread)。

@paxdiablo非常好解释!特别是最后两段

我想你已经用#include导入了math.h

因此,我能看到的另一个原因是缺少链接信息。您必须使用-lm选项链接您的代码。

如果您只是尝试使用gcc编译一个文件,只需将-lm添加到命令行,否则,请提供有关构建过程的一些信息。

它不会构建,因为您没有正确链接,只需尝试将-lm添加到您的构建命令。

在Clibc for csqrt()的情况下?

只需在c源文件中添加#include,最后在Makefile中添加-lm对我有用。

gcc -pthread -o p3 p3.c -lm

抱歉,堆栈溢出隐藏了include语句。我刚刚制作了代码,现在它正在运行。

以下是我的观察,首先需要将头math.h包含在math.h头文件中声明的sqrt()函数中。例如

#include

其次,如果您阅读sqrt的手册页,您会注意到此行与-lm链接。

#include /* header file you need to include */

double sqrt(double x); /* prototype of sqrt() function */

Link with -lm. /* Library linking instruction */

But application still says undefined reference to sqrt. Do you see any

problem here?

编译器错误是正确的,因为您没有将程序与库lm链接并且链接器无法找到sqrt()的引用,您需要显式链接它。例如

gcc -Wall -Wextra -Werror -pedantic test.c -lm

我有同样的问题,但我只是通过在运行我的代码的命令后添加-lm来解决它。

例。

gcc code.c -lm

这与几年前发布的其他答案有何不同?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值