如何避免在Delphi中多次将zlib objs链接到二进制文件中

时间:2011-10-23 13:28:15

标签: delphi zlib

我一直在谷歌上搜索zlib如何通过仅使用ZLib单元(Delphi 7)解码gzip / deflate http编码的示例。我一直在使用Indy 10但后来我遇到一篇文章说很多第三方组件实现了他们自己的zlib助手,最终导致多个zlib对象链接到输出文件中。我有这个庞大的项目,并寻找减小尺寸的方法。我对二进制文件进行了搜索,结果发现我至少连接了4个zlib副本。

有没有办法避免多次将zlib obj文件链接到二进制文件中?我可以让Indy完全不使用/ import zlib吗?

2 个答案:

答案 0 :(得分:2)

  

有没有办法避免将zlib obj文件链接到二进制文件中   不止一次?

不,没有。链接.obj文件对每个单元都是私有的。您无法从一个单元检测到某个其他单元已链接.obj文件。

答案 1 :(得分:1)

你确定它是连接二进制相同的副本吗?如果差异对链接zlib / zlibex的各个库有影响怎么办?如果你真的想解决这个问题,你应该删除Delphi附带的INdy软件包和DCU / DCP二进制文件,并自己构建源代码。

列出我们,您正在使用的包含ZLib的库。现在获取每个的完整源代码,并自己构建它们。使它们全部依赖(在设计时)包含ZLib源的公共包,以便ZLib源不会在设计时多次加载。现在为您的非包装环境做同样的事情;确保只存在一个ZLib源文件的副本,使用C编译器将它们构建到obj文件中(ZLib是一个C包),然后链接到这些文件,并测试它们以确保它们都能正常工作。如果您在更改zlib版本后无法测试所有内容,请立即放弃尝试。如果你不能或不想学习阅读C代码,也放弃你的尝试。

在Delphi 2009 Enterprise和ARchitect中,在XE之前,读者需要警惕,这会引发级联问题的多米诺骨牌效应,这些问题无法完全恢复,例如,如果您依赖于DataSnap,它依赖于精确的ABI与Delphi一起提供的Indy BPl。当然在像Delphi 7这样的古老版本上,您可以解决所有这些问题,并在Delphi 7上自行重建。

我无法猜测你有哪些库可能包含Zlib的重复,但我发现它的一些常见的地方是:任何类型的zip /存档库(TurboPower Abbrevia),网络库(如Indy),等等。 JEDI JCL包含ZLib的副本,并包含自己的基于Zlib的压缩组件,如果您使用它们,它们将被链接。您必须在自己的源代码中查找内容。如果你很惊讶地发现4个Zlib副本(也许它们是Zlib的不同版本,甚至),如果你开始探索代码和组件源代码,我可以保证你会发现更多的惊喜。