Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我要在同一个链接器调用中传递obj文件两次?_C_Linker_Ld - Fatal编程技术网

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

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

我在一个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-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
可以帮助您自动确定正确的顺序,但我不能说它是对还是错,因为我从未使用过这些工具