将未使用的动态加载的lib链接到C ++应用程序构建中的缺陷是什么(如果有的话)?

时间:2016-11-04 14:31:26

标签: c++ linker shared-libraries

问题说的都是真的。这更多是出于我自己的好奇心,看看是否有人知道为什么要避免这种情况的特殊原因!

我唯一的想法是,即使没有调用库函数,编译器仍会生成加载代码并加载库,即使它不会被使用。我猜这里,有兴趣知道其实际意义是什么!

谢谢!

3 个答案:

答案 0 :(得分:1)

在程序启动时,您应该期望加载库。这是内存使用和启动时间的影响(我不是说影响有多小/大)。这是Windows上带有Microsoft工具链的标准案例,据我所知this answer to another question,Linux也是如此。

请注意,这与在Windows上使用LoadLibrary不同。 LoadLibrary是一种Windows工具,用于在运行时显式加载和使用动态库,而无需在构建时进行链接。

Microsoft工具链允许您可选地指定Dll将被延迟加载。如果你这样做,那么除非你使用dll,否则实际上不会加载dll。工具链通过将构建时间dll替换为按需运行时加载来实现此目的。

答案 1 :(得分:1)

至少在Linux上,无论何时加载程序加载库,它都会花一些时间来解析它的动态重定位(命中1)。同时将未使用的库放在内存中会降低后续加载的库的符号分辨率(命中2)。最后,loader将为所有已加载的库(通常是C ++构造函数,但通常是其他东西)运行初始化程序,这将消耗时间(命中3)并且还可以有效地禁用延迟加载(因为初始化程序调用库中定义的函数,因此强制它们通过装载机)(点击4)。

作为旁注 - 现代Linux工具链有一个很好的标志-Wl, - as-needed将自动摆脱未使用的动态依赖(由于传递依赖性,它并不总是直截了当但结果是值得的)。

答案 2 :(得分:0)

如果你没有调用LoadLibrary,或者自动延迟加载DLL,那就没有陷阱了。

https://msdn.microsoft.com/en-us/library/hf3f62bz.aspx

如果实际加载了库,则会调用DllMain。如果DllMain包含错误或恶意代码,则可能发生任何事情。