Как избежать компиляции msvcrt.dll с помощью MinGW64?

У меня есть код C ++, который я компилирую для различных платформ, а именно для 32/64 бит Linux, 32/64 бит Windows. Что касается Windows, я использую последний компилятор gcc, предоставляемый пакетом mingw-w64. Проблема, с которой я столкнулся, заключается в том, что 32-битная компиляция перетаскивает API libc, который Microsoft предоставляет через msvcrt.dll, и у этой DLL есть некоторые проблемы:

  1. не распространяется (поставляется с Windows и не подлежит замене)
  2. есть версии (каждая версия Windows имеет разные версии с дополнительными функциями)
  3. это зависит от других DLL Windows, то есть от экосистемы библиотек, связанных с этой конкретной версией DLL, которые также являются частью системы.

mingw использует определенную версию, поэтому он не будет работать по умолчанию в более старых версиях, например в Windows XP: для него потребуются точки входа для несуществующих API.

Я пробовал связывать статически, но безрезультатно, msvcrt.dll всегда перетаскивается (-static, -static-libgcc, -static-libstdc ++, вы называете это).

Я попытался довольно откровенно заменить msvcrt.dll, который поставляется с Windows XP, на тот, который работает в более поздней версии Windows, но это вообще не позволяет 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 (), API, представленного в Vista. Как только я это исправлю, он запрашивает у меня _mkgmtime32 () из msvcrt.dll, который был представлен в версии 7 библиотеки DLL и, очевидно, отсутствует в DLL, поставляемой с Windows XP.

Я также знаю, что хочу использовать C ++ 17 с операционной системой, которой почти 20 лет, но она все еще пользуется огромной популярностью, по крайней мере, в третьем мире. Кто-нибудь знает об этом?

Резюме

Есть ли способ связываться со статической многопоточной библиотекой времени выполнения VC при использовании MinGW64?
Что эквивалентно флагу /MT в Visual Studio при использовании MinGW64?


person Leandro    schedule 17.04.2019    source источник
comment
MinGW означает минималистичный GNU, его философия дизайна заключается в том, чтобы обеспечить как можно меньше поддержки стандартных библиотек, предпочитая перенаправлять на другие реализации библиотеки, такие как msvc. Если вам нужна полная реализация (компилятор и библиотека), отдельная от msvcrt, тогда mingw - это не тот проект, на который нужно смотреть.   -  person M.M    schedule 26.04.2019
comment
Были ли у вас какие-то успехи в этом вопросе?   -  person Royi    schedule 07.10.2019
comment
@Royi: Нет, я сдался, извините. Я перепробовал множество вещей, но ничего не помогло :(   -  person Leandro    schedule 07.10.2019


Ответы (1)


  1. Последняя версия Visual Studio 2019 по-прежнему поддерживает Windows XP со специальным «набором инструментов» vc141_xp. Вы можете распространять Последний "Универсальный ЭЛТ" на XP.
  2. MinGW может связываться с универсальным CRT - вам не нужно используйте старый msvcrt.dll, вы можете связать его с любым msvcrXX.dll или современным ucrtbase.dll, как описано по ссылке выше, и он будет работать в Windows XP.
person vitalyster    schedule 17.10.2019