如何避免使用MinGW64编译`msvcrt.dll`?

问题描述 投票:1回答:1

我有一些可以编译到各种平台的C ++代码,即Linux 32/64位,Windows 32/64位。对于Windows,我使用mingw-w64软件包提供的最新gcc编译器。我遇到的问题是32位编译拖累了Microsoft通过msvcrt.dll提供的libc API,并且该DLL存在一些问题:

  1. 不可分发(它是Windows附带的,不可替换)
  2. 具有版本(每个Windows版本都有一个不同的版本,具有附加功能)
  3. 它取决于其他Windows DLL,这意味着该特定版本的DLL周围的库生态系统也属于系统。

mingw使用特定版本,因此默认情况下不会在较早版本上运行,例如在Windows XP中:它将需要不存在的API的入口点。

我尝试了静态链接,但无济于事,msvcrt.dll总是会被拖动(-static,-static-libgcc,-static-libstdc ++,您将其命名)。

我很坦率地尝试将Windows XP附带的msvcrt.dll替换为可在较新的Windows版本中运行的msvcrt.dll,但它完全阻止了Windows XP的启动。

我曾尝试将正确的msvcrt.dll复制到我的可执行路径,但是由于它是每个人都使用的库,因此已经加载了,Windows不会从其他文件中加载另一个实例。

我尝试修补可执行文件,以便它将调用相同的DLL,但使用不同的名称,因此愚蠢的Windows仅为我的可执行文件加载较新的版本,并且第一步起作用,但它启动了DLL依赖项的噩梦,永远不要满足,因为它将引入其他系统库,例如ntdll.dll,这些系统库也必须进行修补等等。

我尝试在此处以及在不同的论坛中浏览有关此相同问题的几个问题,但是一切都归结为这样的想法:msvcrt.dll是一个您不必担心的库,但是那根本就不对,有太多的兼容性问题。

我知道mingw慢慢地抛弃了Windows XP之类的较早的操作系统,但是我真的很想找到一个解决问题的方法,这个问题不应该看起来那么复杂。我首先将mingw-w64-i686-libwinpthread和mingw-w64-i686-winpthreads从当前的7.0.0.5325降级到最近的7.0.0.5273,以避免调用GetTickCount64(),这是Vista中引入的API。修复此问题后,它会要求我从msvcrt.dll中提供_mkgmtime32(),该DLL是在DLL的版本7中引入的,而Windows XP随附的DLL中显然没有。

我也知道我想将C ++ 17与已经有近20年历史的操作系统一起使用,但是它仍然非常流行,至少在第三世界中仍然如此。有人对此有任何见解吗?

摘要

使用MinGW64时是否可以链接到静态多线程VC运行时库?使用/MT时,Visual Studio中MinGW64标志的等效项是什么?

dll windows-xp static-linking mingw-w64 msvcrt
1个回答
0
投票
  1. 最新的Visual Studio 2019仍支持带有特殊vc141_xp“工具集”的Windows XP。您可以在XP上redistribute最新的“通用CRT”。
  2. MinGW能够与Universal CRT链接-完全不需要使用旧的msvcrt.dll,您可以按照上面的链接中所述与任何msvcrXX.dll或现代ucrtbase.dll链接,并且它将在Windows XP上运行。
© www.soinside.com 2019 - 2024. All rights reserved.