C 为什么我要在同一个链接器调用中传递obj文件两次?
我在一个C项目中工作,该项目在其构建系统中调用ld,如下所示:C 为什么我要在同一个链接器调用中传递obj文件两次?,c,linker,ld,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 但是我遇到了这个命令行大小的问题(大约32000个字符,包含所有需要的对象文件,并且使用cygwin),所以我开始研究对它的一些修改。其中之一是删除对相同对象的第二个引用。像这样: ld --allow-multiple-de
ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a a.o b.o c.o
但是我遇到了这个命令行大小的问题(大约32000个字符,包含所有需要的对象文件,并且使用cygwin),所以我开始研究对它的一些修改。其中之一是删除对相同对象的第二个引用。像这样:
ld --allow-multiple-definition --architecture mips -EB --relocatable a.o b.o c.o -o mylib.a
然而,这使事情发生了变化。我到处都有很多未定义的引用
为什么会这样?两个电话的区别是什么?我在看劳工处的文件,但到目前为止还没有好结果
奖金
如果幸运的话,您的ld版本可能会有--开始组objs.o--结束组选项来处理类似的事情。一般来说,如果库
X
依赖于库Y
中定义的符号,然后在提供给ld
的库列表中,X
应该出现在Y
前面。看起来您可以通过两次提供对象文件的名称来解决这个问题:这样,每对{X,Y}
也将以{Y,X}
的形式出现在列表中,并且将链接,而不考虑对象内部的依赖关系。有时你有循环引用;然后,您必须在ld
的列表中放置一个对象两次
通常情况下,您只需在订购过程中反复操作,直到正确完成为止。但是,使用32-K命令行似乎不可能做到这一点。我读到,lorder
和tsort
可以帮助您自动确定正确的顺序,但我不能说它是对还是错,因为我从未使用过这些工具