我有一个类似于以下的代码库:
来源:
src/a/b/c.cpp
和单元测试(这些实际上是提升单元测试可执行文件):
test/a/b/c_test.cpp
src
树用于单个可执行目标。然而,c.cpp
仅使用该目标的库依赖项的子集,例如-lx
,属于 -lx -ly -lz
。
类似地,c_test.cpp
编译成链接到 c.cpp 的 -lx
、c.o
和一些其他库的测试可执行文件用于测试。
对于设置构建系统,在这种情况下我有两个选择:
- 将构建系统中的每个此类可执行文件与其自己的库依赖列表配对。 (很痛苦,但也许可以通过映射 header 依赖项 -> 库来实现自动化。)
- 或者,只对所有测试可执行文件和主要可执行文件使用相同的库列表。 (简单、无痛的方式)。
#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/