在Windows中静态链接DLL

在Windows中静态链接DLL,dll,static,linker,Dll,Static,Linker,考虑这种情况: 我正在创建一个DLL(我们称之为dllA),它反过来调用其他DLL中的函数(我们称之为dllX、dllY和dllZ)。如果其他人想使用dllA,他们还需要dllX、Y和Z的副本 是否有一种方法可以构建dllA,从而将dllX、Y和Z中所需的函数链接到dllA中?我不知道这是否是正确的术语,但这叫做“静态链接DLL”吗 我在寻找一个简单的解决方案。如果存在这样的东西的话,我很乐意使用一些简单的东西,将dllX、Y和Z连接起来,并以某种方式将其附加到dllA中。 但我有一种不好的感觉

考虑这种情况:

我正在创建一个DLL(我们称之为dllA),它反过来调用其他DLL中的函数(我们称之为dllX、dllY和dllZ)。如果其他人想使用dllA,他们还需要dllX、Y和Z的副本

是否有一种方法可以构建dllA,从而将dllX、Y和Z中所需的函数链接到dllA中?我不知道这是否是正确的术语,但这叫做“静态链接DLL”吗

我在寻找一个简单的解决方案。如果存在这样的东西的话,我很乐意使用一些简单的东西,将dllX、Y和Z连接起来,并以某种方式将其附加到dllA中。 但我有一种不好的感觉,没有简单的解决办法

我在Windows上,使用VS


谢谢

我不相信你能。我还没听说有人这样做。如果您有对其他DLL的生成访问权,那么您可以将它们构建为静态库,这将根据您的需要工作,但它们被称为动态链接库是有原因的


编辑:刚刚找到。

您不能静态链接DLL,只能链接库。DLL是自包含的,具有静态成员和DllMain加载/卸载依赖项,这意味着它们不能拆分为包含函数并链接到不同的可执行文件中

您应该创建一个安装程序,根据需要部署所有适当的DLL


如果你真的认为这很重要,而且你不能依赖你的应用程序安装程序,那么你可以创建一个包装器,将所需的DLL(a、X、Y和Z)作为资源嵌入其中,并在运行时提取它们并将它们写入user profile temp文件夹中的磁盘,然后加载提取的dllA并将所有传入函数调用延迟到加载的dllA。一些sysinternals工具使用类似的技术从x86映像中提取应用程序的x64映像,并作为64位进程重新启动自己,而不必提供两个单独的EXE。

从技术上讲,您不能静态链接DLL,但“”相当于它

  • 在可执行文件中包含使用_declspec(dllimport)说明符的头文件声明
  • 与dll同名的.lib在构建dll时随dll一起生成,称为其“导入库”。将此库链接到可执行文件
  • 将dll放在exe旁边

  • 然后,只要调用exe,windows就会加载DLL,有效地充当静态库。

    你有所有DLL的源代码吗?我喜欢将DLL提取到临时文件夹的想法。。。有关于如何做的示例/教程吗?