VC runtime 2017 中用于 MinGW 7 的 scanf 函数系列的位置

Location of scanf function family in VC runtime 2017 to be used in MinGW 7

我正在使用:

基本上发生的事情如下:

  1. 一个可执行文件是使用 VS 2017 构建的
  2. .so 是用 GCC 构建的
  3. .so 由步骤 1 中创建的可执行文件加载

问题源于 MSVCRTMinGW 默认情况下 links 反对 MSVCRT.DLL 并且使用 VS 2017 创建的可执行文件使用 VCRUNTIME140.DLLUCRTBASE.DLL.

加载 .so 时,存在两个 CRT,一个来自 MSVCRT.DLL,另一个来自 VCRUNTIME140.DLLUCRTBASE.DLL。这会在应用程序运行时导致随机 issues/memory 问题。

解决方案是让 MinGW link 对抗 VCRUNTIME140.DLL 而不是 MSVCRT.DLL。我已经通过从 VCRUNTIME140.DLL 创建一个导入库并将其添加到 MinGW 并转储 GCC 规范并修改它来做到这一点link 到 VCRUNTIME140.DLLUCRTBASE.DLL.

我现在的问题是 scanf 系列功能。我似乎无法在 VCRUNTIME140.DLLUCRTBASE.DLL.

中找到 scanf 函数

scanf 家族现在在全新的 UCRT 中处于什么位置?

所以,我刚刚编译了一个使用 scanf 的小测试应用程序,并使用 VS 2017 编译它,发现它使用 API-MS-WIN-CRT-STDIO-L1-1-0.DLL 然后使用 UCRTBASE.DLL for scanf 以这种方式出现 __stdio_common_vscanf.

我现在很迷茫。 MinGW GCC 是否有任何一种干净的方法来引用 scanf 函数?

我能够通过仅将 -D_UCRT 添加到 cppcc1plus[ 来消除链接期间未定义的 scanf 错误=27=] GCC 规范文件的部分。

我在检查了 mingw src\mingw-w64\mingw-w64-crt\stdio 的 stdio 文件夹中的源代码和 MinGW sourceforge 的讨论论坛中的一些线程后找到了这个解决方案。

MinGW stdio.h#ifdef _UCRT 围绕 scanf 相关函数。