我想用C / C ++ for Windows创建一个轻量级的便携式应用程序。我不想静态链接所有内容,因为我希望尽可能减小exe的大小。我还使用Dependency Walker来跟踪我的exe文件的DLL依赖项。
我的问题是,应用程序可以拥有的DLL依赖项的列表是什么,并且可以在不同版本的Windows中保持可移植性?有了这个列表,我可以使用列表检查Dependency Walker的输出,并选择静态链接哪些库以及动态链接哪些库。我更喜欢列表包含来自Windows XP的操作系统更高,但考虑到Windows 98也很有趣。
答案 0 :(得分:3)
在Visual Studio中创建一个基本的Win32应用程序,并使用Dependency Walker检查依赖项。这些是你的基础依赖。将需要所有标准的Win32 DLL文件,包括user32.dll
,kernel32.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 - 它可能会使您的程序不那么便携,但它是一次性安装(某种)系统组件,没有人必须卸载。