我正在编写一个 C 项目,该项目必须使用 math.h 中定义的 pow 函数。 当我尝试制作该项目时,gcc 给出了以下链接错误: 对“pow”的 undefined reference 。
我知道必须将 -lm 选项添加到我的链接指令中,但仍有几个问题令我困惑。
问题1:当我将两个常量传递给pow函数时,没有-lm链接就成功了。为什么?
Q2:-lm 位于链接指令的末尾或开头会产生不同的结果。 gcc -lm $(OBJS) -o exbin 是错误的,但 gcc $(OBJS) -o exbin -lm 是正确的。为什么?
我使用 ubuntu 11.10 和 gcc 4.4.4。
谢谢!请原谅我的台球英语。
最佳答案
编译器了解 pow(3, 4)
或其他内容,并通过在编译时计算结果来优化程序,因此在链接和运行时不需要库。
链接器不会从库中添加内容,除非它知道需要它。对于静态库来说,这是完全正确的。对于共享库,某些版本的编译器会记录所有读取的共享库中的所有符号,即使在扫描库时不需要它们。较新的版本仅在扫描时至少需要其中一个符号时才采用共享库。当库首先出现时,唯一需要的符号是 main()
(这就是为什么 main()
被指定为托管环境的起点),因此数学库被忽略,因为其中没有需要的符号。
关于c - 关于链接数学库的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10082815/