因此,当使用GCC编译大量源文件时,可以使用-j来使用所有可用的核心。但是链接器呢?是否有类似的选项来加速链接,或者GCC不支持多线程?在一些大型项目中,它可能需要一段时间...(我讨厌等待!)
**编辑:**感谢您指出-j是make的选项,而不是gcc/g++。但这并没有回答我的问题!我想知道如果gcc可以使用多线程,而 * 链接 * 一个程序!
rhfm7lfc1#
试试gold,它是由Ian Lance Taylor等人开发的。并作为GNU binutils包的一部分发布。维基百科:编写gold的动机是制作一个比GNU链接器更快的链接器,特别是对于用C++编写的大型应用程序我必须承认,我还没有尝试过,但它的WebKitGTK project网页上提到。欲了解更多信息,请参阅黄金作者写的一篇文章:A New ELF Linker。更重要的是,请参阅Sander Mathijs货车Veen在增量/并行/并发链接方面的工作,标题为Concurrent Linking with the GNU Gold Linker,以及其中的参考书目。
lvjbypge2#
lld是LLVM项目开发的链接器,默认情况下将使用多个内核。我还发现它比多线程运行的gold快2倍(-Wl,--threads -Wl,--thread-count,xxx)
-Wl,--threads -Wl,--thread-count,xxx
wko9yo5t3#
在2022年,mold linker是另一个很好的选择。它是可用于ELF目标的最快链接器,并具有最积极的并行性。
8nuwlpux4#
您提到的-j选项由make处理,而不是gcc。使用make -j n要求make在Makefile中运行多个并行进程的操作(将n替换为一个数字。在make -j 2的情况下,它是2进程)。在进行并行构建时,Make可以很好地处理大多数同步任务。
-j
make
gcc
make -j n
Makefile
n
make -j 2
2
8nuwlpux5#
以金换银-有经验吗?我在一个最小的合成基准上对LD vs gold vs LLVM LLD进行了基准测试,时间结果清楚地表明,gold和LLVM LLD都能够根据time进行并行连接,例如:
time
nogold: wall=4.35s user=3.45s system=0.88s 876820kB gold: wall=1.35s user=1.72s system=0.46s 739760kB lld: wall=0.73s user=1.20s system=0.24s 625208kB
我们知道使用了并行链路,因为在这两个CPU中,wall时间小于user时间这些基准测试也重现了Martin Richtarsky的2倍更快的LLVM LLD链接时间。
wall
user
rkkpypqq6#
以下是CMake上的两个选项(在3.16.3上测试):
find_program(GNU_GOLD_PROGRAM gold) if (GNU_GOLD_PROGRAM) include(ProcessorCount) ProcessorCount(HOST_PROC_COUNT) add_link_options("-fuse-ld=gold;LINKER:--threads,--thread-count=${HOST_PROC_COUNT}") endif(GNU_GOLD_PROGRAM)
find_program(LLD_PROGRAM lld) if(LLD_PROGRAM) add_link_options("-fuse-ld=lld") endif(LLD_PROGRAM)
更完整的例子:here注意:如果您收到错误消息“ld.lld:error:unable to find library.”您可能需要在link_directories调用中添加库目录列表,如下所示:
find_program(LLD_PROGRAM lld) if(LLD_PROGRAM) add_link_options("-fuse-ld=lld") link_directories(/usr/lib64 /usr/local/lib64) endif(LLD_PROGRAM)
6条答案
按热度按时间rhfm7lfc1#
试试gold,它是由Ian Lance Taylor等人开发的。并作为GNU binutils包的一部分发布。
维基百科:
编写gold的动机是制作一个比GNU链接器更快的链接器,特别是对于用C++编写的大型应用程序
我必须承认,我还没有尝试过,但它的WebKitGTK project网页上提到。
欲了解更多信息,请参阅黄金作者写的一篇文章:A New ELF Linker。
更重要的是,请参阅Sander Mathijs货车Veen在增量/并行/并发链接方面的工作,标题为Concurrent Linking with the GNU Gold Linker,以及其中的参考书目。
lvjbypge2#
lld是LLVM项目开发的链接器,默认情况下将使用多个内核。我还发现它比多线程运行的gold快2倍(
-Wl,--threads -Wl,--thread-count,xxx
)wko9yo5t3#
在2022年,mold linker是另一个很好的选择。
它是可用于ELF目标的最快链接器,并具有最积极的并行性。
8nuwlpux4#
您提到的
-j
选项由make
处理,而不是gcc
。使用
make -j n
要求make
在Makefile
中运行多个并行进程的操作(将n
替换为一个数字。在make -j 2
的情况下,它是2
进程)。在进行并行构建时,Make可以很好地处理大多数同步任务。
8nuwlpux5#
以金换银-有经验吗?我在一个最小的合成基准上对LD vs gold vs LLVM LLD进行了基准测试,时间结果清楚地表明,gold和LLVM LLD都能够根据
time
进行并行连接,例如:我们知道使用了并行链路,因为在这两个CPU中,
wall
时间小于user
时间这些基准测试也重现了Martin Richtarsky的2倍更快的LLVM LLD链接时间。
rkkpypqq6#
以下是CMake上的两个选项(在3.16.3上测试):
更完整的例子:here
注意:如果您收到错误消息“ld.lld:error:unable to find library.”您可能需要在link_directories调用中添加库目录列表,如下所示: