gpt4 book ai didi

c - gcc 链接静态库

转载 作者:太空狗 更新时间:2023-10-29 17:21:12 33 4
gpt4 key购买 nike

我正在阅读一本名为“GCC 简介”的书,希望得到一些说明。 书上指出下面的代码会导致错误但是当我编译时,它构建并运行完美:

#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;
}

我引用了书“仅从该源文件创建可执行文件会导致编译器在链接阶段给出错误:

$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function `main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference
to `sqrt'

这本书给出的解决方案是你应该包含数学库“libm.a”的路径,如下所示:

$ gcc -Wall calc.c /usr/lib/libm.a -o calc

必须指定我们在程序中使用的内置库的路径会非常不方便。我可以理解将路径添加到我自己的自定义库的原因,但是 libm.a 是内置于 gcc 中的。尽管这本书很旧(2004 年出版),随着 gcc 的更现代版本发生了变化,因此我们不需要包括 libm.a?

* 更新 *

我注意到 taskinoor 给出的答案演示了更新的代码,如果传递给 sqrt() 的值在编译时未知,则要求我使用 -lm 标志。

我使用 VS 学习了 C/C++,但我现在的目标是学习和使用 gcc。我有 Visual Studio 2013 并且 VS 编译器/链接器似乎并不那么挑剔。例如,我几乎可以编译任何简单的程序,而无需指定神秘的编译器标志。

我正在学习 KUBUNTU 16.04.1 附带的 gcc 5.4 版

最佳答案

sqrt (2.0);

现代 GCC 能够很好地确定您正在尝试求常数的平方根,因此它能够在编译时计算出该值。您的目标代码不包含对 sqrt 的实际调用。

如果您使用在运行时通过 scanf 输入的变量,那么它不会在没有 libm 的情况下链接。

int main() {
double x;

scanf("%lf", &x);
printf("%lf\n", sqrt(x));

return 0;
}

在 Ubuntu 14.04 上没有 libm gcc 4.8.4 这个结果:

/tmp/ccVO2fRY.o: In function `main':
sqrt.c:(.text+0x2c): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

但是,如果我像您的示例那样放置一个常量而不是 x,那么它可以在没有 libm 的情况下正常链接。

P.S:我不知道确切的版本,因为 GCC 什么时候能够做到这一点。希望其他人可以指出这一点。

关于c - gcc 链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39755217/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com