适用于Windows的可移植C / C ++应用程序的DLL依赖项

时间:2011-07-14 06:12:58

标签: c++ c dll portable-executable

我想用C / C ++ for Windows创建一个轻量级的便携式应用程序。我不想静态链接所有内容,因为我希望尽可能减小exe的大小。我还使用Dependency Walker来跟踪我的exe文件的DLL依赖项。

我的问题是,应用程序可以拥有的DLL依赖项的列表是什么,并且可以在不同版本的Windows中保持可移植性?有了这个列表,我可以使用列表检查Dependency Walker的输出,并选择静态链接哪些库以及动态链接哪些库。我更喜欢列表包含来自Windows XP的操作系统更高,但考虑到Windows 98也很有趣。

3 个答案:

答案 0 :(得分:3)

在Visual Studio中创建一个基本的Win32应用程序,并使用Dependency Walker检查依赖项。这些是你的基础依赖。将需要所有标准的Win32 DLL文件,包括user32.dllkernel32.dll等。 (虽然其中一些会有所不同,具体取决于您希望应用程序执行的操作。在某些情况下,您只能使用kernel32.dll,但您将无法在屏幕上显示窗口。可能是相当无用的应用程序。)

请记住,可以编译在Windows 98上运行的应用程序的Visual Studio的最新版本是Visual Studio 2005. Visual Studio 2008可以针对最少的Windows 2000,而VS 2010可以针对最少的Windows XP SP2。您需要使用较旧版本的编译器,或手动编辑可执行文件的PE头以更改子系统字段。

如果你真的喜欢这样的事情(虽然这实际上是浪费时间)你应该调查Matt Pietrek的LIBCTINY,最初来自2001年1月在MSDN杂志上发表的an article。这个小图书馆使它成为现实。理论上可以使用/NODEFAULTLIB compiler flag以避免链接到CRT。

答案 1 :(得分:2)

如果要链接到标准Windows DLL,则没有问题,因为目标系统上已存在DLL。

对于其他DLL,如果必须分发DLL,则总可执行代码大小将大于使用静态链接时的大小。如果您有多个使用公共库的应用程序,则最终只能使用较小的可执行代码。

换句话说,虽然动态链接听起来很诱人,但老式的静态链接对你来说可能更好。

现在,如果您担心链接到C运行时,那么您可以考虑使用mingw,它可以链接到所有系统上都存在的Windows C运行时。

答案 2 :(得分:1)

我假设你正在使用VC。 Microsoft提供了您在MSDN中寻找的列表。参见:

请注意,列表会根据VC的版本更改(您可以在页面顶部选择您的版本)。此外,在现代版本的Windows上,建议使用VCRedist _ * .exe正确安装运行时dll - 它可能会使您的程序不那么便携,但它是一次性安装(某种)系统组件,没有人必须卸载。