gpt4 book ai didi

c - 为什么我要在同一个链接器调用中两次传递 obj 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:10 25 4
gpt4 key购买 nike

我在一个 C 项目中工作,该项目在其构建系统中调用 ld,如下所示:

ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a a.o b.o c.o

但是我遇到了这个命令行大小的问题(大约 32,000 个字符和所有需要的目标文件 - 并且使用 cygwin)所以我开始研究对其进行一些修改。其中之一是删除对相同对象的第二个引用。像这样:

ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a

然而,这打破了一切。我到处都有很多很多 undefined reference 。

为什么会这样?两种调用有什么区别?我正在阅读 ld 的文档,但到目前为止效果不佳。

奖金

如果你足够幸运,你的 ld 版本可能有 --start-group objs.o --end-group 选项处理这样的事情。

最佳答案

一般来说,如果库 X 依赖于库 Y 中定义的符号,那么 X 应该出现在 Y 在提供给 ld 的库列表中。看起来您可以通过提供两次目标文件的名称来解决此问题:这样,每对 {X, Y} 也会在列表中显示为 {Y, X },并且无论对象内依赖性如何都将链接。有时你有循环引用;那么您必须将对象放入ld 的列表两次。

通常,您只需调整顺序,直到正确为止。但是,您的 32-K 命令行看起来不太可能。我读了here lordertsort 可以帮助您自动确定正确的顺序,但我不能说它是对还是错,因为我从未使用过这些工具。

关于c - 为什么我要在同一个链接器调用中两次传递 obj 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158490/

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