在Windows中静态链接DLL

时间:2009-09-29 05:22:26

标签: dll static linker

考虑这种情况:

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

有没有办法构建dllA,使dllX,Y和Z中所需的函数链接到dllA?我不知道这是否是正确的术语,但这被称为“静态链接DLL”吗?

我正在寻找一个简单的解决方案。我会对简单地连接dllX,Y和Z并将其附加到dllA的某些东西感到高兴,如果这样的事情存在的话。 但我有这种不好的感觉,没有简单的解决办法。

我在Windows上,使用VS。

谢谢!

3 个答案:

答案 0 :(得分:6)

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

您应该根据需要创建一个部署所有相应dll的安装程序。

如果你真的认为这很重要并且你不能依赖你的app安装程序,你可以创建一个包装器,将所需的dll(A,X,Y和Z)作为资源嵌入,并在运行时提取它们并将它们写入磁盘用户配置文件临时文件夹,然后加载提取的dllA并将所有传入的函数调用推迟到加载的dllA。一些sysinternals工具使用类似的技术从x86映像中提取应用程序的x64图像,并重新启动为64位进程,而不必运送两个独立的exes。

答案 1 :(得分:2)

从技术上讲,您无法静态链接DLL,但是' Implicit linking'相当于它。

  1. 在可执行文件中使用__declspec(dllimport)说明符包含头文件声明。
  2. 与dll同名的.lib与DLL一起生成,称为“导入库”。将此lib链接到可执行文件。
  3. 将dll放在exe旁边。
  4. 然后,只要调用exe,windows就会加载DLL,有效地充当静态库。

答案 2 :(得分:1)

我不相信你可以。我还没有听说过这件事。如果您具有对其他DLL的构建访问权限,那么您可以将它们构建为静态库,并且可以按照您的需要工作,但这就是为什么它们被称为动态链接库的原因。

编辑:刚刚找到this thread