【发布时间】:2019-11-13 13:51:21
【问题描述】:
我正在使用:
- VS 2017
- 带有 GCC/G++ 7.4.0 的 MinGW。
基本上发生的事情如下:
- 使用 VS 2017 构建可执行文件
- .so 使用 GCC 构建
- .so 由步骤 1 中创建的可执行文件加载
问题源于MSVCRT。 MinGW 默认链接到 MSVCRT.DLL,使用 VS 2017 创建的可执行文件使用 VCRUNTIME140.DLL 和 UCRTBASE.DLL。
当.so 被加载时,存在两个CRT,一个来自MSVCRT.DLL,另一个来自VCRUNTIME140.DLL 和UCRTBASE.DLL。这会导致应用程序运行时出现随机问题/内存问题。
解决方案是让 MinGW 链接到 VCRUNTIME140.DLL 而不是 MSVCRT.DLL。我通过从VCRUNTIME140.DLL 创建导入库将其添加到 MinGW 并转储 GCC 规范并对其进行修改以使其链接到 VCRUNTIME140.DLL 和 @ 987654333@.
我现在的问题是scanf 家族函数。我似乎在VCRUNTIME140.DLL 或UCRTBASE.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