我正在一个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 选项照顾那样的事情。
答案 0 :(得分:0)
通常,如果库X
依赖于库Y
中定义的符号,那么X
应该出现在Y
的{{1}}之前。 1}}。看起来您可以通过两次提供目标文件的名称来解决这个问题:这样,每对ld
也会在列表中显示为{X, Y}
,并且无论是否在内,都会链接到对象依赖。有时你有循环引用;然后你必须将对象放在{Y, X}
的列表上两次。
通常情况下,您只需要处理订购,直到您做对了。但是,使用32-K命令行看起来不太可能。我读了here ld
和lorder
可以帮助您自动确定正确的顺序,但我不能说它是对还是错,因为我从未使用过这些工具。