3 回答
TA贡献1895条经验 获得超3个赞
这是我的观察,首先需要将标头math.h作为标头文件中sqrt()声明的函数包括在内math.h。例如
#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
TA贡献1802条经验 获得超6个赞
您可能会发现您必须与所使用的任何系统上的数学库链接,例如:
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 都出现,为时已晚。
- 3 回答
- 0 关注
- 524 浏览
添加回答
举报