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

DLL dependencies for portable C/C++ application for Windows

本文关键字:应用程序 DLL c++ 依赖 Windows 可移植 用于      更新时间:2023-10-16

我想用C/c++为Windows创建一个轻量级的可移植应用程序。我不想静态地链接所有内容,因为我想保持exe的大小尽可能小。我还使用Dependency Walker来跟踪exe文件的DLL依赖项。

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

在Visual Studio之类的工具中创建一个基本的Win32应用程序,并使用Dependency Walker检查依赖项。这些是基本依赖项。所有标准的Win32 DLL文件都是必需的,包括user32.dllkernel32.dll等等。(尽管这其中的一些变化取决于您希望应用程序做什么。在某些情况下,你可以只使用kernel32.dll,但你将无法在屏幕上显示窗口。可能是一个相当无用的应用程序。)

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

如果你真的对这样的事情感兴趣(尽管这真的是浪费时间),你应该研究一下Matt Pietrek的LIBCTINY,它最初来自于2001年1月发表在MSDN杂志上的一篇文章。这个小库使得理论上可以使用/NODEFAULTLIB编译器标志来避免链接到CRT。

如果你正在链接到标准的Windows dll,那么没有问题,因为dll已经存在于目标系统上。

对于其他DLL,如果您必须分发DLL,那么您的总可执行代码大小将大于使用静态链接时的大小。如果你有多个使用公共库的应用程序,你只会得到更小的可执行代码大小。

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

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

我假设你正在使用VC。微软提供了你在MSDN中寻找的列表。看到:

  • 重新分配Visual c++文件
  • 决定重新分发哪些dll

注意列表根据VC的版本而变化(你可以在页面顶部选择你的版本)。此外,在现代版本的Windows上,建议使用VCRedist_*.exe正确安装运行时dll -它可能会使您的程序不像您希望的那样可移植,但它是一次性安装(某种程度上)系统组件,没有人需要卸载。