Как избежать msvcrt.dll компиляции с mingw-64 32 бит? - PullRequest
1 голос
/ 17 апреля 2019

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

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

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

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

Я довольно откровенно пытался заменить файл msvcrt.dll, поставляемый с Windows XP, на тот, который работает в более поздней версии Windows, но вообще не позволяет загрузить Windows XP.

Iпопытался скопировать правильный файл msvcrt.dll в мой путь к исполняемому файлу, но поскольку это библиотека, которую все используют, она уже загружена, и Windows не будет загружать другой экземпляр из другого файла.

Я попытался пропатчить мой исполняемый файл, чтобы он вызывал ту же DLL, но с другим именем, и поэтому Windows обманывает, чтобы загрузить более свежую версию только для моего исполняемого файла, и этот первый шаг работает, но он начинает кошмарЗависимости DLL, которые никогда не могут быть удовлетворены, потому что это принесет другие системные библиотеки, такие как ntdll.dll, которые также должны быть исправлены и т. Д.

Я попытался просмотреть несколько вопросов по этой теме здесь и на разных форумах.Что касается этой же проблемы, но все сводится к идее, что msvcrt.dll - это библиотека, о которой вам не следует беспокоиться, но это просто неправда, в связи с этим возникает множество проблем совместимости.

IЯ знаю, что 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 лет, но она по-прежнему популярна, по крайней мере, в третьем мире.У кого-нибудь есть понимание по этому поводу?

...