gpt4 book ai didi

c - GCC libm 不工作

转载 作者:IT王子 更新时间:2023-10-29 00:09:29 27 4
gpt4 key购买 nike

我有一个调用 sin、cos 和 acos 的 c 程序。编译时出现以下错误:

/tmp/ccDfW98S.o: In function `zip_search':
main.c:(.text+0xf30): undefined reference to `sin'
main.c:(.text+0xf45): undefined reference to `sin'
main.c:(.text+0xf66): undefined reference to `cos'
main.c:(.text+0xf7b): undefined reference to `cos'
main.c:(.text+0xf9c): undefined reference to `cos'
main.c:(.text+0xfc6): undefined reference to `acos'
collect2: ld returned 1 exit status

我知道当您不使用 -lm gcc 标志时这很常见。我正在使用这个标志。我这样调用 GCC:

gcc -o zipcode-server -lm main.c

当我在我的一台计算机上编译时,它工作正常。我能想到的唯一区别是这不适用于 x86_64,而它可以运行的计算机是 i686。两者都是Ubuntu。文件 libm.a 存在于它不工作的计算机上,我没有收到任何错误提示找不到它。可能是什么原因造成的?

最佳答案

你应该把 -lm 放在 main.c 之后

一般来说,如果你有多个库,应该按照它们的使用顺序来编写。例如,如果库 A 使用库 B,您应该有 -lA -lB

在你的例子中,作为 main.c 编译结果的目标文件使用库 m 因此 -lm 应该来之后。


出于好奇,这主要是出于效率原因。使用此方案,链接器可以使用参数列表中看到的每个新库解析当前未知符号,并在途中从该库中选取新的未知符号。这意味着链接器可以一个一个地访问库,因此将未知符号与每个库提供的少量符号进行匹配。

相比之下,链接器可以一次加载所有库中的符号,然后开始匹配未知符号。然而,在这种情况下,链接器需要处理更多的符号,从而增加了内存占用和链接器的执行时间。

由于库始终可以按照其依赖项的正确顺序向链接器声明1,因此链接器没有理由选择低效的方式。

1 从一个使用另一个的意义上说,图书馆通常具有单向关系。库之间的循环依赖关系很少见(如果存在的话),但它仍然可以通过重复某些要重新检查的库来与此模型一起使用。

关于c - GCC libm 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10059146/

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