【发布时间】:2019-10-15 17:49:57
【问题描述】:
在 Brian Gough 所著的“GCC 简介”一书的第 14 页,作者想要显示一个链接器错误,因为没有为 gcc 提供 libm 库,函数 sqrt 的代码所在的位置:
$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function ‘main’:
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference to ‘sqrt’
文件calc.c(函数sqrt被调用)是这样的:
#include <math.h>
#include <stdio.h>
int main (void)
{
double x = sqrt (2.0);
printf ("The square root of 2.0 is %f\n", x);
return 0;
}
这本书是 2003 年的。 在我当前的 Ubuntu Linux 18 上,我无法重现链接错误:它链接并工作,打印正确的结果:
$ ./calc
1.414214
我在ldd calc 中发现libm.so 共享库在运行时不会被调用。当然这里也不涉及静态库libm.a。
那么gcc是如何处理函数sqrt的呢?我发现在这种情况下它使用了sqrt GCC 内置函数。
它的代码在编译时被插入到calc.o 目标文件中。所以没有“未定义的引用”错误。
第一个问题:这是整个故事还是我遗漏了什么?
第二个问题:为什么 GCC 内置函数的这种行为在 2003 年(本书写作之时)和现在之间发生了如此大的变化? (在我看来,实际上使整个示例无效)
第三个问题:为什么作者的例子(例如$ gcc -Wall calc.c -lm -o cal)暗示将使用静态库libc.a,而实际上在Linux中该语法调用动态库@ 987654336@?这是否特定于 Linux 而不是 GNU GCC?我错过了什么?
【问题讨论】:
-
因为 15 年是很多的时间。
标签: gcc linker-errors built-in