我正在构建一个win32可执行文件。编译器是MinGW的最新版本。库依赖项是GLUT和libpng。
我首先在Windows 7机器上测试过,并且必须获取libpng3.dll和freeglut32.dll。但是,在XP上,我不得不(另外)获取zlib1.dll。
XP机器是一个全新安装的VM,所以我怀疑一台新的win7机器也可能缺少zlib1。
我的问题是如何找出我需要分发哪些dll?我怎么知道先验,我的程序在特定系统上运行需要哪些动态库?我想这就是安装程序的用途......我猜测安装程序所做的是查看系统,找出哪些依赖项不满意,然后提供它们。所以这种方式,如果我分发我的程序,我可以检查用户的机器是否已经有zlib1.dll,如果已经在系统目录中找到它,我将不会安装zlib1.dll。但是我从来没有找到一个特别对我说的文件,“libpng需要zlib”,所以,直到我在缺少zlib的机器上测试可执行文件这一点,我才意识到这种依赖。如何在不对每个操作系统的每个版本进行全新安装的情况下创建我的依赖关系列表?
我的一个想法是反编译可执行文件,或者通过某种方法检查链接过程,找到在运行时链接的所有库。问题现在变得弄清楚哪些应该已经存在,以及我可以期望在分发中提供哪些。
编辑好的,我看了,我下载的libpng的安装确实在其bin目录中提供了zlib1.dll。所以不包括它几乎是我的错。无论如何,丹尼尔的答案是肯定的。
答案 0 :(得分:1)
Dependendy Walker会显示您计划的所有代码。
答案 1 :(得分:0)
在我看来,这个问题的正确答案是从源头开始,而不是使用Dependency Walker反向设计解决方案,这无疑是有用的工具,但毫无疑问是。
Dependency Walker的问题在于它只告诉你程序运行它的OS需要一个特定的程序运行。如果您的应用程序中有任何动态加载依赖项,那么只有在确定使用Dep对应用程序进行概要分析时才会选择这些依赖项。沃克并强迫它通过这些动态载荷。
我解决此问题的首选方法是从您自己的源代码开始,分析并了解它所依赖的内容。这样做通常很容易,因为你很清楚。
您需要了解编译器的部署要求。您通常可以选择静态和动态地链接到C ++运行时。显然,动态链接会导致部署要求。
您也可能会链接到第三方代码。一个例子是Windows组件。这些通常不需要部署,您可以将它们视为已经存在。有时这不是真的,例如Windows 2000上的GDI +。
有时您会静态链接到第三方代码(再次简单),但如果您动态链接则意味着部署要求。