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

What (if any) are the pitfalls of leaving unused dynamically loaded libs linked into a C++ application build?

问题说明了一切。这更多是出于我自己的好奇心,看看是否有人知道应该避免这种情况的特定原因!

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

谢谢!

如果您不调用 LoadLibrary,或自动延迟加载 DLL,则没有陷阱。

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

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

在程序启动时,您应该会加载库。这是对内存使用和启动时间的影响(我不是说 small/big 有多大影响)。这是 Windows 上使用 Microsoft 工具链的标准情况,据我了解 this answer to another question,Linux 上也是如此。

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

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

至少在 Linux,每当加载程序加载库时,它都会花费一些时间来解析它的动态重定位(命中 1)。此外,将未使用的库放在内存中会减慢随后加载的库的符号解析(命中 2)。最后,加载器将为所有加载的库(通常是 C++ 构造函数,但通常是其他东西)初始化 运行,这将消耗时间(命中 3)并且还可能有效地禁用延迟加载(因为初始化器调用库中定义的函数,从而强制它们由加载程序解决)(命中 4)。

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