c - 关于链接数学库的一些问题

标签 c gcc math.h

我正在编写一个 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/

相关文章:

c - c中负数逻辑右移的实现

c - 给定一个长字符串数组,如何有效地检查给定的子字符串对(给定字符串)是否最多相差一个字符?

关于操作数求值顺序的矛盾

c - 如果 GCC 错误 _Pragma 出现在中间预处理步骤中,它会触发吗?

c - 这在 gdb 中意味着什么?

包含文件的更改未在 C 中注册

编译器说 pow 是未定义的,即使我正在链接 -lm,但编译时

C++ - 外部整数( double )

gcc - 与 'gcc' 和 '-lm' 相关的链接错误

c++ - 取消引用 NULL 指针是否保证使 C/C++ 中的程序崩溃?