windows - 可以使用压缩的 dll 吗?

标签 windows dll dynamic-linking upx

我真的缺乏在 Windows 上开发东西的经验,我可能错过了一些明显的东西,尽量保持冷静:)

我有一个应用程序 (Qt C++),它使用自己路径中的一些 .dll(我的意思是我将这些 .dll 与 .exe 一起交付) .当我交付应用程序时,我通过 upx 压缩 dll。 .它极大地压缩了它们,我可以在不解压缩的情况下使用那些 dll

我的印象是我做错了什么,但它只是偶然起作用,所以我想确定一下,使用压缩的 dll 是否可以?还是我应该随时预料到不可预知的问题? (这是主要问题)

如果 .dll 可以在压缩模式下使用,那么为什么我们首先要将它们解压缩。

最佳答案

这不是“偶然工作”的东西,UPX 旨在压缩 Win32-PE(和许多其他格式),无论是可执行文件还是 DLL。

至于“可以吗?”,是的,当然是“可以”,只要您不违反另一方的许可即可。 与 Qt 相关的任何事情都不太可能发生这种情况,但原则上,这是一种可能性。例如,可以使用一些具有许可条款的 DLL,例如“以二进制形式分发,等等等等,不允许修改”。比方说,类似于 MSVC 或 DirectX 可再发行组件,或者某些图形卡供应商的专有 API。在任何情况下,记住这一点并在冒着违反许可的风险之前检查许可都不是错误的。

问题的措辞“这还好吗?”略有不同:“这明智吗?”,答案是:可能不是。磁盘上额外的几兆字节通常无关紧要。当您将所有内容打包到安装程序中,并且用户通过互联网下载它时,数据无论如何都会被压缩,所以在这方面是一样的。

但是,无论您使用 UPX 或其他可执行打包程序,还是 Windows 的文件系统压缩,压缩都有副作用。它会导致额外的地址空间碎片,它会禁用异步传输,并且会丧失操作系统从工作集中丢弃 DLL 页面并在访问时从 PE 镜像透明地重新加载它们的能力。

最后一句话意味着操作系统必须在页面文件中进行分配,并且当您的进程的工作集移出时,它必须将页面写入页面文件为别的东西腾出空间。没有别的办法。现在,如果用户禁用了页面文件怎么办...

关于windows - 可以使用压缩的 dll 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480326/

相关文章:

java - apache tomcat 8009 端口正在使用中

c# - pinvoke:结构在C端填充,但回到家后数据消失了

c# - 如何将包装器 DLL 连接到 API DLL 以便在 C# 项目中使用?

c# - 在哪里可以找到 "Microsoft.VisualStudio.TestTools.UnitTesting"丢失的 dll?

java - 从 Java 执行 cmd.exe 命令

c++ - 从 .dll 访问 .exe 中定义的函数的正确方法

windows - Docker 构建彩色消息不可读

c - Linux 何时加载 .so 文件?

linux - Caffe 安装,链接问题

shared-libraries - 如何在 Linux 上设置 LibGDX 的 fbx-conv