在Windows中静态链接DLL

6 dll linker static

考虑这种情况:

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

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

我正在寻找一个简单的解决方案.我会对简单地连接dllX,Y和Z的原始内容感到满意,如果存在这样的事情,我会以某种方式将其附加到dllA.但我有这种不好的感觉,没有简单的解决方案.

我在Windows上,使用VS.

谢谢!

Rem*_*anu 7

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

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

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


Viv*_*ian 7

从技术上讲,您不能静态链接 DLL,但“隐式链接”等效于它。

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

然后 Windows 将在调用 exe 时加载 DLL,有效地充当静态库。


Nic*_*ord 2

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

编辑:刚刚找到这个线程