对 sqrt(或其他数学函数)的未定义引用

发布于 2024-10-21 02:25:30 字数 205 浏览 9 评论 0原文

我有这个简单的代码:

max = (int) sqrt (number);

在标头中我有:

#include <math.h>

但应用程序仍然显示对 sqrt 的未定义引用。你看到这里有什么问题吗?看起来一切都应该没问题。

I have this simple code:

max = (int) sqrt (number);

and in the header I have:

#include <math.h>

But application still says undefined reference to sqrt. Do you see any problem here? It looks like everything should be okay.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

淡笑忘祈一世凡恋 2024-10-28 02:25:30

您可能会发现,无论您使用什么系统,都必须链接到数学库,例如:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

包含标头可以让编译器了解函数声明,但它不一定自动链接到所需的代码来执行该功能。

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

以下代码可以正常编译和链接:

#include <math.h>
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 do 的未解析符号出现时,为时已晚。

You may find that you have to link with the math libraries on whatever system you're using, something like:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

Including headers lets a compiler know about function declarations but it does not necessarily automatically link to the code required to perform that function.

Failing that, you'll need to show us your code, your compile command and the platform you're running on (operating system, compiler, etc).

The following code compiles and links fine:

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

Just be aware that some compilation systems depend on the order in which libraries are given on the command line. By that, I mean they may process the libraries in sequence and only use them to satisfy unresolved symbols at that point in the sequence.

So, for example, given the commands:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

and plugh.o requires something from the xyzzy library, the second may not work as you expect. At the point where you list the library, there are no unresolved symbols to satisfy.

And when the unresolved symbols from plugh.o do appear, it's too late.

所有深爱都是秘密 2024-10-28 02:25:30

我想您已经使用 #include 导入了 math.h,

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

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

I suppose you have imported math.h with #include <math.h>

So the only other reason I can see is a missing linking information. You must link your code with the -lm option.

If you're simply trying to compile one file with gcc, just add -lm to your command line, otherwise, give some informations about your building process.

国产ˉ祖宗 2024-10-28 02:25:30

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

#include <math.h>

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

#include <math.h> /* header file you need to include */

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

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

但应用程序仍然显示未定义对 sqrt 的引用。你看到任何
这里有问题吗?

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

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

Here are my observation, firstly you need to include the header math.h as sqrt() function declared in math.h header file. For e.g

#include <math.h>

secondly, if you read manual page of sqrt you will notice this line Link with -lm.

#include <math.h> /* 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?

Compiler error is correct as you haven't linked your program with library lm & linker is unable to find reference of sqrt(), you need to link it explicitly. For e.g

gcc -Wall -Wextra -Werror -pedantic test.c -lm
凯凯我们等你回来 2024-10-28 02:25:30

只需在 c 源文件中添加 #include 并在 Makefile 最后添加 -lm 就可以了。

    gcc -pthread -o p3 p3.c -lm

Just adding the #include <math.h> in c source file and -lm in Makefile at the end will work for me.

    gcc -pthread -o p3 p3.c -lm
屋檐 2024-10-28 02:25:30

我遇到了同样的问题,但我只是通过在运行代码的命令后添加 -lm 来解决它。
例子。
gcc代码.c -lm

I had the same issue, but I simply solved it by adding -lm after the command that runs my code.
Example.
gcc code.c -lm

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文