C++ 链接器的分治方法

C++ 链接器的分治方法,c++,linker,ld,C++,Linker,Ld,我有多个文件(>300个对象文件),需要使用“ld”命令链接这些文件。 现在,当我等待链接过程完成时,我浪费了很多时间(这个过程并不总是成功的) 我有下一个问题:我可以使用“分而治之”的方法进行链接,例如,在单个对象文件(例如objfile1-2.o)中链接每对对象文件(例如objfile1.o和objfile2.o)。之后,将此方案应用于每对对象。 此外,链接上一阶段获得的每对对象,依此类推。 最后,在一个结果文件中链接几个对象(可能是成对的) 我可以使用此方案链接(与ld)吗?不,这不是建议

我有多个文件(>300个对象文件),需要使用“ld”命令链接这些文件。 现在,当我等待链接过程完成时,我浪费了很多时间(这个过程并不总是成功的)

我有下一个问题:我可以使用“分而治之”的方法进行链接,例如,在单个对象文件(例如objfile1-2.o)中链接每对对象文件(例如objfile1.o和objfile2.o)。之后,将此方案应用于每对对象。 此外,链接上一阶段获得的每对对象,依此类推。 最后,在一个结果文件中链接几个对象(可能是成对的)


我可以使用此方案链接(与ld)吗?

不,这不是建议的方法。但是,您可以为部分创建静态库或共享库,并为多个可执行文件(如果有与共享库链接的文件)与共享库链接。对于没有任何重叠的每个可执行文件,这肯定比单一链接要少花费一些时间。

不,这不是一种建议的方法。但是,您可以为部分创建静态库或共享库,并为多个可执行文件(如果有与共享库链接的文件)与共享库链接。对于没有任何重叠的每个可执行文件,这肯定比单一链接要少花费一些时间。

无论您如何处理,链接最终可执行文件时,链接器必须仔细阅读整个内容列表。链接过程的任何中间“暂存”都只会增加运行时间

想象一下:

  • o包含foo(),bar()
  • o包含fiddle(),lee()
  • o包含main(),它调用上述函数

链接时,链接器需要将函数链接在一起,而不管它们是在一个文件还是两个文件中。

无论您如何处理,链接最终可执行文件时,链接器必须仔细阅读整个内容列表。链接过程的任何中间“暂存”都只会增加运行时间

想象一下:

  • o包含foo(),bar()
  • o包含fiddle(),lee()
  • o包含main(),它调用上述函数

链接时,链接器需要将函数链接在一起,而不管它们是在一个文件还是两个文件中。

二进制拆分可能不是一个好主意,但您可能需要 可以通过将应用程序分成多个部分来缩短链接时间 多个共享对象,并针对这些对象进行链接。链接时 对于共享对象,链接器实际上不必 将数据复制到可执行文件中,但只检查 共享对象确实定义了所需的符号

尽管如此,300个对象文件并不多,也不应该让事情变慢 降低那么多,至少用现代系统,至少如果 他们在本地开车。(回到过去,当 所有东西都在一个远程驱动器上,我们用来设置 生成文件,以便链接阶段在文件服务器上运行, 而不是在我们本地的机器上。这可以通过
一个10或更多的因数。)

二进制分割可能不是一个好主意,但您可能 可以通过将应用程序分成多个部分来缩短链接时间 多个共享对象,并针对这些对象进行链接。链接时 对于共享对象,链接器实际上不必 将数据复制到可执行文件中,但只检查 共享对象确实定义了所需的符号

尽管如此,300个对象文件并不多,也不应该让事情变慢 降低那么多,至少用现代系统,至少如果 他们在本地开车。(回到过去,当 所有东西都在一个远程驱动器上,我们用来设置 生成文件,以便链接阶段在文件服务器上运行, 而不是在我们本地的机器上。这可以通过
10倍或更多。)

静态库可能对他的问题没有帮助,可能会使问题变得更糟。静态库可能对他的问题没有帮助,可能会使问题变得更糟。如果这样的事情可能/实际上更快,我想大多数流行的编译器都会实现它。如果这样的事情可能/实际上更快,我想大多数流行的编译器已经实现了它。这只是部分正确。当针对
.so
进行链接时,链接器只需扫描
.so
的一部分,即可查看是否定义了符号。当针对
.o
进行链接时,链接器必须将整个文件数据(对象代码和符号表)复制到它正在构建的文件中,这需要更多的时间。(当然,当链接到一个
.a
时,链接器必须首先读取足够的数据,以确定它需要哪个
.o
组成部分,然后按照上面的方法进行处理。)@JamesKanze:OP没有提到链接到
.so
,而是一起链接
.o
,这表示链接到可执行文件(或者,实际上,链接到so)。我决定不让事情复杂化;-)即使在链接多个
.o
文件时,部分链接也可以节省时间。链接器的大部分时间都花在应用重定位上,通过使用
ld-r
@EmployedRussian将相互引用的对象链接到单个对象中,链接器必须处理的重定位数量可以大大减少:我不相信这会节省任何东西。首先,使用
ld-r
将不同的.o文件链接到一个对象中可能需要的时间与首先将它们全部链接到可执行文件中所需的时间差不多(您仍然需要这样做)。第二,您拒绝链接器将未使用的.o内容放在一边的机会,即使并非所有代码都是必需的,也会产生一个完整的二进制文件。这只是部分正确。当针对
.so
进行链接时,链接器只需扫描
.so
的一部分,即可查看是否定义了符号。当针对
.o
进行链接时,链接器必须复制整个文件数据(obj