c++ - gcc 链接到未使用的库对构建系统性能的影响

标签 c++ performance gcc ld build-system

我有一个类似于以下的代码库:

来源:

src/a/b/c.cpp

和单元测试(这些实际上是提升单元测试可执行文件):

test/a/b/c_test.cpp

src 树用于单个可执行目标。然而,c.cpp 仅使用该目标的库依赖项的子集,例如-lx,属于 -lx -ly -lz

类似地,c_test.cpp 编译成链接到 c.cpp 的 -lxc.o 和一些其他库的测试可执行文件用于测试。

对于设置构建系统,在这种情况下我有两个选择:

  1. 将构建系统中的每个此类可执行文件与其自己的库依赖列表配对。 (很痛苦,但也许可以通过映射 header 依赖项 -> 库来实现自动化。)
  2. 或者,只对所有测试可执行文件和主要可执行文件使用相同的库列表。 (简单、无痛的方式)。

#2“in the large”对构建系统性能的影响是什么?这真的重要吗?

杂项: 这是 g++ (Debian 4.9.1-16) 4.9.1

最佳答案

这个问题的答案实际上取决于这些库是什么,但总的来说,我会说“可能没有太大影响,除非库很大”。实际使用的库才是问题所在,尤其是当它们很大时,因为必须复制库中的所有代码。

我只是做了一个小实验,并编译了一个“Hello World”程序(使用clang++,但是无论你使用clang++还是在后端使用相同的链接器g++,使用编译器提供的默认库。最佳时间为0.232s(第一次,因为编译器必须从磁盘读取大约需要2秒)。

然后我添加了 llvm-config --libs(所以当你使用 llvm 编译器框架时你需要的库)。变成这样:

-lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter
-lLLVMIRReader -lLLVMAsmParser -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption 
-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG 
-lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info 
-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMRuntimeDyld -lLLVMLineEditor 
-lLLVMInstrumentation -lLLVMInterpreter -lLLVMExecutionEngine -lLLVMCodeGen 
-lLLVMScalarOpts -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMBitReader 
-lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget 
-lLLVMMC -lLLVMCore -lLLVMSupport

当链接进来时,我的编译器项目变成了一个 100MB 的可执行文件。

“hello world”程序的编译时间差异约为 0.04 秒。

因此,我会保持简单并维护一个库列表。

不过我要补充一点,这确实取决于文件所在的位置。如果你在一个非常慢的文件服务器上链接一堆文件,可能需要更长的时间来阅读“这个库包含什么”。

关于c++ - gcc 链接到未使用的库对构建系统性能的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26747187/

相关文章:

c++ - 获取目录列表

javascript - 有没有举起行为有益的例子

css - 在 :before and :after for every element a massive performance issue? 上声明 "content"属性

c++ - 从 GNU 上的新运算符调用类构造函数 - 使用无效类

gcc - 当 -pedantic 打开时,在 GCC 中抑制 "extra ' ;'"错误

c++ - 如何使用智能指针替换 char*?

c++ - 错误: function definition is marked dllimport

c++ - 使用 cmake 包含我自己的共享库

javascript - Bluebird promise 库 : are . map 和 .filter 并行运行?

gcc - Cortex-M4 和 GCC - float 行为