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

时间:2012-06-22 14:43:55

标签: c linker ld

我正在一个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

然而,这打破了局面。我到处都有很多未定义的引用。

为什么会这样?这两个电话有什么区别?我正在阅读ld的文档,但到目前为止还不好。

奖金

如果您足够幸运,您的ld版本可能包含 - start-group objs.o - end-group 选项照顾那样的事情。

1 个答案:

答案 0 :(得分:0)

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

通常情况下,您只需要处理订购,直到您做对了。但是,使用32-K命令行看起来不太可能。我读了here ldlorder可以帮助您自动确定正确的顺序,但我不能说它是对还是错,因为我从未使用过这些工具。