【问题标题】:DLL dependencies for portable C/C++ application for Windows适用于 Windows 的可移植 C/C++ 应用程序的 DLL 依赖项
【发布时间】:2011-07-14 06:12:57
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c dll portable-executable


    【解决方案1】:

    在 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,最初来自 an article,早在 2001 年 1 月发表在 MSDN 杂志上。这个小库使其在理论上成为可能使用/NODEFAULTLIB compiler flag 以避免链接到CRT。

    【讨论】:

    • 这个基本应用程序是否可移植地在 Windows XP 或 98 中运行?
    • @Sina:这取决于你用什么版本的微软 C/C++ 编译器(与 Visual Studio 捆绑)来编译它。我在回答中更完整地解决了这个问题。较新版本的 CRT 调用在较早版本的 Windows 上根本不存在的函数。
    • 谢谢科迪。我的结论是 CRT 是创建可移植程序的主要问题。这是真的吗?还是标准 Win32 DLL 也存在其他类型的问题?例如,它们在不同的 Windows 版本中不兼容。
    • @Sina:是的,CRT 绝对是主要问题。但是 Win32 DLL 也有潜在的障碍。这完全取决于您的应用调用了哪些函数。您必须确保调用所有目标平台上可用的函数(这意味着您不能使用 Windows Vista 的新功能,即使在它们所在的操作系统上也是如此可用),或者你必须typedef所有你想使用的功能,并通过LoadLibraryGetProcAddress动态加载DLL的乏味。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • mingw 在这里与微软的编译器有什么不同?
    • @Cody mingw 可以使用 Windows 安装(即 system32 中的那个)中的 msvcrt.dll 作为其 C 运行时。 Visual Studio,必须使用自己的运行时。如果我记得的话,MSVC6 是最后一个可以使用 Windows C 运行时的版本。
    • 感谢大卫的观点。我认为 C 运行时对于创建可移植程序来说是一个令人头疼的问题。我用 Dependency Walker 检查了 utorrent.exe,发现它实际上也在使用 msvcrt.dll。
    • @新浪你可以随时静态链接。您必须在方便的情况下平衡可执行文件的大小。也就是说,如果您可以使用链接到 Windows msvcrt.dll 的工具链,那么我认为这是一个很好的解决方案。
    【解决方案3】:

    我假设您使用的是 VC。 Microsoft 提供了您在 MSDN 中查找的列表。见:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多