Как мне собрать UCRT с помощью mingw-w64?
Я хотел бы иметь возможность использовать mingw-w64 для создания двоичных файлов, которые ссылаются на универсальный CRT, доступный в Visual Studio 2015+ вместо MSVCRT.lib. Примечания к выпуску mingw-w64 v6.0.0 включают следующее: "Массовые дополнения для поддержки UCRT благодаря Martin Storsjö"
К сожалению, мои поиски не выявили документацию о том, как использовать эту поддержку.
Кто-нибудь знает, какие варианты мне нужно предоставить и где их поставить?
0 ответов
Что ж, я сделал это вместе с VS 2017. Но насколько я понимаю, и VS 2015, и VS 2017 используютVCRUNTIME140.DLL
, так что здесь не о чем беспокоиться.
Он разделен на два этапа:
1. Создание библиотеки импорта для VCRUNTIME140.DLL
:
Это делается следующим образом:
mkdir scratch; cd scratch
cp C:/Windows/System32/vcruntime140.dll .
dumpbin /exports vcruntime140.dll > exports.txt
echo LIBRARY VCRUNTIME140 > vcruntime140.def
echo EXPORTS >> vcruntime140.def
tail +20 exports.txt | head -n -10 | awk '{print $4}' >> vcruntime140.def
lib /def:vcruntime140.def /out:libvcruntime140.a /machine:x86
cp libvcruntime140.a $(MINGW_ROOT)/i686-w64-mingw32/lib
2. Измените способ работы MinGW GCC для связи сVCRUNTIME140
а также UCRT
вместо того MSVCRT
gcc -dumpspecs > $(MINGW_ROOT)/lib/gcc/i686-w64-mingw32/$(GCC_VERSION)/specs
- Добавить
-D_UCRT
кcpp
а такжеcc1plus
разделы файла спецификаций. Это предотвратит ошибки связывания неопределенных ссылок дляscanf
функции семьи. Проверьте мой другой вопрос. - Заменить
-lmsvcrt
к-lvcruntime140 -lucrt
вlibgcc
раздел файла спецификаций.
Пожалуйста, обменяйте $(MINGW_ROOT)
с местом, где у вас есть MinGW.
Примечания:
- Часть подписи платформы,
i686-w64-mingw32
, указанные мной пути могут отличаться для вашего случая. Я считаю, основываясь на архитектуре. Поэтому вам, возможно, придется изменить это соответствующим образом. - Вам нужно использовать относительно новый MinGW с
libucrt.a
в папке $(MINGW_ROOT)/i686-w64-mingw32/lib. Я использую MinGW 7.0.0 с GCC 7.4.0.