2011-02-16 124 views
0

我正在构建一个win32可执行文件。编译器是MinGW的最新版本。库依赖关系是GLUT和libpng。缺少zlib.dll

我首先在Windows 7机器上测试过,并且必须获得libpng3.dll和freeglut32.dll。但是,在XP上,我必须(另外)获取zlib1.dll。

XP机器是全新安装的虚拟机,所以我怀疑新的win7机器可能也缺乏zlib1。

我的问题是如何去找出我需要分发哪些dll?我怎么知道,先验,我的程序需要哪些动态库在特定系统上运行?我想这是安装程序的用途......我猜测安装程序所做的是通过系统查找哪些依赖性不满意,然后提供它们。所以这样,如果我要分发我的程序,我可以检查用户的机器是否已经有zlib1.dll,并且如果它已经在系统目录中找到,我将不会安装zlib1.dll。然而,我从来没有找到特别对我说的文档,“libpng需要zlib”,所以,直到我在缺乏zlib的机器上测试可执行文件时,我并不知道这种依赖关系。我怎样才能创建我的依赖列表,而无需全新安装每个操作系统的每个版本进行测试?

我的一个想法是反编译可执行文件,或者通过某种方法检查链接过程,找到所有在运行时链接的库。现在问题变成找出哪些应该已经存在,以及哪些我可以预期在分配中提供。

编辑:好吧,我看了,我下载的libpng的安装在它的bin目录中提供了zlib1.dll。所以不包括它几乎是我的错。无论如何,丹尼尔的答案是确定的。

回答

1

Dependendy Walker显示您的程序的所有代码。

+0

这是完全真棒。谢谢。 – 2011-02-16 05:43:28

+0

几乎每个涉及DLL的问题都有一个答案指向这个工具:)) – Daniel 2011-02-16 06:49:20

0

在我看来,这个问题的正确答案是从源头开始,而不是使用Dependency Walker逆向工程解决方案,尽管它毫无疑问是真棒和有用的工具。

Dependency Walker的问题在于,它只会告诉你程序在哪个特定运行时需要在运行它的操作系统上运行。如果您的应用程序中有任何动态加载依赖关系,那么只有确保您使用Dep对应用程序进行了分析,才会选择这些依赖项。沃克并强迫它通过这些动态负载。

我对这个问题的首选方法是从你自己的源代码开始,分析和理解它依赖于什么。这样做通常很容易,因为你知道它很好。

您需要了解什么是您的编译器的部署要求。您通常可以选择静态和动态链接到C++运行时。显然,动态链接会导致部署需求。

您也可能链接到第三方代码。一个例子是Windows组件。这些通常不需要部署,您可以将它们作为已经存在的地方。有时候这是不正确的,例如在Windows 2000上使用GDI +。

有时您会静态链接到第三方代码(也很容易),但是如果您动态链接,则意味着部署要求。