用于Windows的可移植C/ c++应用程序的DLL依赖
DLL dependencies for portable C/C++ application for Windows
我想用C/c++为Windows创建一个轻量级的可移植应用程序。我不想静态地链接所有内容,因为我想保持exe的大小尽可能小。我还使用Dependency Walker来跟踪exe文件的DLL依赖项。
我的问题是,什么是列表的DLL依赖,一个应用程序可以拥有并保持在不同版本的Windows可移植?有了这个列表,我就可以用这个列表检查Dependency Walker的输出,并选择静态链接哪些库,动态链接哪些库。我更喜欢包含Windows XP操作系统的列表,但想到Windows 98也很有趣。
在Visual Studio之类的工具中创建一个基本的Win32应用程序,并使用Dependency Walker检查依赖项。这些是基本依赖项。所有标准的Win32 DLL文件都是必需的,包括user32.dll
、kernel32.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 -它可能会使您的程序不像您希望的那样可移植,但它是一次性安装(某种程度上)系统组件,没有人需要卸载。
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 将 c++ 生成器应用程序与外部 dll 结合使用
- WinDeployqt 不会为调试应用程序部署 Qwindowsd.dll
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 调试 ASP MVC 应用程序中使用的C++ DLL
- Qt应用程序找不到第三方DLL并崩溃
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- .NET核心应用程序无法加载C++DLL
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 为什么我的 C# 应用程序无法加载我的 C++ dll?
- 应用程序仅在qt调试器中加载dll,而不是独立加载
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- C++ XE 5 应用程序和C++生成器 5 dll 兼容性
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- 使用Visual Studio 2015创建的C 应用程序分发MSVCR120.dll