我有这个简单的代码:
max = (int) sqrt (number);
在标题中我有:
#include <math.h>
但是应用程序仍然说未定义的引用sqrt
。你看到这里有什么问题吗?看起来一切都应该没问题。
我有这个简单的代码:
max = (int) sqrt (number);
在标题中我有:
#include <math.h>
但是应用程序仍然说未定义的引用sqrt
。你看到这里有什么问题吗?看起来一切都应该没问题。
您可能会发现您必须链接到您正在使用的任何系统上的数学库,例如:
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中未解决的符号出现时,为时已晚。
我想你已经导入了 math.h#include <math.h>
所以我能看到的唯一其他原因是缺少链接信息。您必须将您的代码与该-lm
选项相关联。
如果你只是想用 gcc 编译一个文件,只需添加-lm
到你的命令行,否则,提供一些关于你的构建过程的信息。
只需在#include <math.h>
最后添加 in c 源文件和 Makefile 中的 -lm 即可。
gcc -pthread -o p3 p3.c -lm
这是我的观察,首先你需要将头文件包含在头文件中声明math.h
的sqrt()
函数中math.h
。例如
#include <math.h>
其次,如果您阅读sqrt的手册页,您会注意到这一行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 */
但应用程序仍然说未定义的 sqrt 引用。你看到这里有什么问题吗?
编译器错误是正确的,因为您没有将程序与库lm
链接,并且链接器无法找到 的引用sqrt()
,您需要显式链接它。例如
gcc -Wall -Wextra -Werror -pedantic test.c -lm
我有同样的问题,但我只是通过在运行我的代码的命令之后添加 -lm 来解决它。例子。gcc 代码.c -lm