【发布时间】:2021-02-24 08:56:09
【问题描述】:
当我尝试编译以下最小示例时,我遇到了一个奇怪的问题。第一次调用sqrt 没有问题,但第二次调用会引发我不明白的链接器错误,因为我在调用gcc 时确实指定了数学库。当我评论第二行时,它会正确编译/链接。
代码如下:
// File wtf_sqrt.c
#include <math.h>
int main (int argc, char *argv[]) {
int x = 3; // Just an int...
sqrt(3); // This line works fine
sqrt(x); // But this one seems to give the linker trouble. Why?
return 0;
}
这是我的编译命令:
gcc -lm -o wtf_sqrt wtf_sqrt.c
这是返回的错误:
/tmp/ccgQN7y7.o: In function `main':
wtf_sqrt.c:(.text+0x1c): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
我在 Ubuntu 18.04 LTS 上使用 gcc 版本 7.5.0。 libc6-dev 已安装(证明是,sqrt 在我使用 main 的第一行时有效)。代码是用gedit写的,所以应该没有空白字符的问题。不知道我还能给你什么其他信息……
在这一点上,我真的怀疑这是我的配置/分发的问题,但我想要一些外部建议。
【问题讨论】:
-
在 cent os 7 上运行良好,可能是您使用的操作系统没有安装它
-
参数的顺序可能很重要。尝试将
-lm移动到所有源/目标文件之后。 -
sqrt(3);可以被编译器替换为 3 的平方根。或者优化出来,因为它什么都不做。 -
库在它们出现在命令行的地方被搜索,所以如果
sqrt没有被它前面的文件引用,它可能不会被包括在内。将-lm选项移到最后,它应该可以工作。
标签: c gcc linker-errors