【问题标题】:Location of scanf function family in VC runtime 2017 to be used in MinGW 7VC 运行时 2017 中 scanf 函数族的位置,将在 MinGW 7 中使用
【发布时间】:2019-11-13 13:51:21
【问题描述】:

我正在使用:

  • VS 2017
  • 带有 GCC/G++ 7.4.0 的 MinGW。

基本上发生的事情如下:

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

问题源于MSVCRTMinGW 默认链接到 MSVCRT.DLL,使用 VS 2017 创建的可执行文件使用 VCRUNTIME140.DLLUCRTBASE.DLL

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

解决方案是让 MinGW 链接到 VCRUNTIME140.DLL 而不是 MSVCRT.DLL。我通过从VCRUNTIME140.DLL 创建导入库将其添加到 MinGW 并转储 GCC 规范并对其进行修改以使其链接到 VCRUNTIME140.DLL 和 @ 987654333@.

我现在的问题是scanf 家族函数。我似乎在VCRUNTIME140.DLLUCRTBASE.DLL 中找不到scanf 函数。

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

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

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

【问题讨论】:

    标签: c++ gcc visual-studio-2017 mingw


    【解决方案1】:

    我只需将-D_UCRT 添加到cppcc1plus 部分GCC 规范文件。

    我在检查了 mingw src\mingw-w64\mingw-w64-crt\stdio 的 stdio 文件夹中的源代码以及 MinGW sourceforge 论坛中的一些帖子后得出了这个解决方案。

    MinGW stdio.h 具有 #ifdef _UCRT 周围的 scanf 相关功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多