c++ - 使用 MinGW GCC 编译的可执行文件中的某些 steam_api.dll 调用出现段错误。有什么方法可以确定加载了哪个 DLL?

标签 c++ mingw mingw-w64 msys2 steamworks-api

我正在制作一个C++游戏,并通过MSYS2环境在Windows MinGW GCC上集成Steam的API。我已成功链接到该库,并且某些功能运行正常。

我能够初始化 steamworks 并运行 SteamFriends()->GetPersonaName(),并且它按预期返回我自己的 Steam 用户。

但是,当我运行 SteamUser()->GetSteamID() 时,它给了我一个段错误。经过调试,我发现 SteamUser() 返回一个地址(它不是 NULL),但该地址没有寻址有效的 ISteamUser 类/结构。我开始相信,也许 Windows 为 steam_api 加载的 DLL 不是我链接的那个。

有什么办法可以确定吗?还有人有任何其他调试方法可以用来尝试识别问题吗?

我还使用 Visual Studio 编译了一个相同的应用程序,它没有遇到段错误,因此我已将问题隔离到我的代码外部,可能与 DLL 的链接方式有关。

最佳答案

SteamUser()->GetSteamID()崩溃是由于 MINGW(由您的应用程序使用)和 MSVC(由 Steam DLL 使用)之间的 C++ ABI 差异造成的。基本上GetSteamID()不仅返回整数值,还返回 CSteamID类,并且传递类值的二进制约定在不同的编译器中是不同的。

相关 SteamWorks 讨论(仅适用于经过批准的 Steam 开发者):

要修复此调用(以及可能存在相同问题的其他 SteamAPI 调用),您可以使用 <steam/steam_api_flat.h> 中的 C API ,它不受 ABI 差异的影响:

SteamAPI_ISteamUser_GetSteamID(SteamUser())

混合使用 C 和 C++ API 是可以的,因此大多数时候您仍然可以使用 C++ API,只有在有问题的调用时才使用 C API。

或者您可以切换到 MSVC 或 MSVC-clang。

关于c++ - 使用 MinGW GCC 编译的可执行文件中的某些 steam_api.dll 调用出现段错误。有什么方法可以确定加载了哪个 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71711846/

相关文章:

mingw - 与libwinpthread的静态链接

c++ - 将任何类型转换为任何类型

c++ - mingw-w64 和 SDL2 链接问题

c# - WPF 控件中的 native Win32 窗口

linux - 如何在 Ubuntu 上安装 mingw32?

c - 尝试使用 matlab 的 libmat.dll,但编译器无法识别库中的函数

python - "cannot find vcvarsall.bat"错误后 pip 的 MinGW 编译器,仍然无法正常工作

c++ - 如何隐藏在 Qt 应用程序中打开的 Windows 终端?

c++ - 在 C++ 编译时计算和打印阶乘

c++ - 在对象工厂中注册一个对象创建者