我有一个类似于以下代码库:
来源:
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
的测试可执行文件以及一些用于测试的其他库。
为了设置构建系统,在这种情况下,我有两个选项:
#2"在大型"中的构建系统性能影响是什么?这真的很重要吗?
其他: 这是用g ++(Debian 4.9.1-16)4.9.1
答案 0 :(得分: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秒。
所以,我会保持简单并维护一个库列表。
但我会补充说,它确实取决于文件的位置。如果你在非常慢的文件服务器上链接一堆文件,可能需要更长的时间来阅读"这个库包含什么"。