C++ 将未使用的动态加载lib链接到C++;应用程序构建?

C++ 将未使用的动态加载lib链接到C++;应用程序构建?,c++,linker,shared-libraries,C++,Linker,Shared Libraries,问题真的说明了一切。这更多是出于我自己的好奇心,想知道是否有人知道为什么应该避免这样做 我唯一的想法是,即使没有调用库函数,编译器仍然会生成加载代码并加载库,即使它不会被使用。我在这里猜测,我很想知道它的实际含义是什么 谢谢 如果不调用LoadLibrary,或自动延迟加载DLL,则没有陷阱 如果库已实际加载,则将调用DllMain。如果DllMain包含bug或恶意代码,任何事情都可能发生。如果不调用LoadLibrary,或自动延迟加载DLL,则没有陷阱 如果库已实际加载,则将调用Dll

问题真的说明了一切。这更多是出于我自己的好奇心,想知道是否有人知道为什么应该避免这样做

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


谢谢

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


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

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


如果库已实际加载,则将调用DllMain。如果DllMain包含bug或恶意代码,则可能会发生任何情况。

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

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


Microsoft工具链允许您选择指定延迟加载Dll。如果您这样做,那么直到/除非您使用dll,否则实际上不会加载dll。工具链通过将构建时dll链接替换为运行时按需加载来实现这一点。

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

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


Microsoft工具链允许您选择指定延迟加载Dll。如果您这样做,那么直到/除非您使用dll,否则实际上不会加载dll。工具链通过使用运行时按需加载替换构建时dll链接来实现这一点。

至少在Linux上,每当加载程序加载库时,它都会花费一些时间来解析它的动态重新定位(点击1)。内存中还有未使用的库,这会降低随后加载的lib的符号解析速度(命中2)。最后,加载程序将为所有加载的库(通常是C++构造函数,但通常是其他的东西)运行初始化器,这将消耗时间(命中3),并且还可以有效地禁用懒惰加载(如在库中定义的初始化器调用函数,从而迫使它们通过加载程序来解决)(命中4)。
作为旁注-现代Linux工具链有一个很好的标志
-Wl,--As-needed
,它将自动消除未使用的动态依赖项(由于可传递的依赖项,它并不总是简单的,但结果是值得的)。

至少在Linux上,只要加载程序加载库,它将花费一些时间来解决它的动态重新定位(点击1)。内存中还有未使用的库,这会降低随后加载的lib的符号解析速度(命中2)。最后,加载程序将为所有加载的库(通常是C++构造函数,但通常是其他的东西)运行初始化器,这将消耗时间(命中3),并且还可以有效地禁用懒惰加载(如在库中定义的初始化器调用函数,从而迫使它们通过加载程序来解决)(命中4)。
作为旁注-现代Linux工具链有一个很好的标志
-Wl,--As needed
,它将自动消除未使用的动态依赖项(由于可传递依赖项,它并不总是简单的,但结果是值得的)。

我假设同样的原则也适用于。那么Linux环境中的文件呢?它应该,IIRC DllMain在linux中被称为_init()。我假设同样的原则也适用于。所以linux环境中的文件?应该是这样,IIRC DllMain在linux中被称为_init()。POSIX via也支持延迟加载。POSIX via也支持延迟加载。