繁体   English   中英

gcc与静态库链接

[英]gcc linking with static libraries

我正在读一本名为“海湾合作委员会简介”的书,希望得到一些澄清。 本书表明下面的代码会导致错误,但是当我编译时,它会构建并运行完美:

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

如果没有libm gcc 4.8.4在Ubuntu 14.04上,这会导致:

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

但是,如果我像你的例子那样放一个常数而不是x那么它在没有libm情况下链接正常。

PS:我不知道确切的版本,因为GCC能够做到这一点。 希望其他人可以指出这一点。

我注意到在某些操作系统上,没有显式链接就可以使用公共库。 特别是,我经常采用一个最初在我的Mac上开发的工作C项目,并且在我明确链接到我使用的库(如libm)之前,该项目不会在Linux上编译。

当然,这通常用于动态而非静态链接......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM