【问题标题】:Setting up SDL2 with eclipse and mingw: SDL_INIT crash使用 eclipse 和 mingw 设置 SDL2:SDL_INIT 崩溃
【发布时间】:2017-10-05 21:54:07
【问题描述】:

我一直在尝试重新运行一个使用 SDL2 的旧 c++ eclipse 项目,但是尝试重新创建我的系统以使 SDL2 完全可以工作变得令人愤怒。此时我正在尝试重新安装 eclipse、mingw 和 sdl,同时尝试 32 位和 64 位版本,但没有组合工作。我认为这是我安装它的方式的问题,这就是为什么我会对我所做的事情过于明确,但显然我不确定。如果您只关心 SDL 错误,请跳过接下来的两段。

我使用的是 Windows 7 64 位机器。我的第一反应是从其主站点上的下载链接下载 64 位版本的 Eclipse Neon for c++。 因为我正在使用 Windows 64,所以我在 (https)sourceforge.net/projects/mingw-w64 获得了 w64 版本的 mingw。它的安装程序有多个版本输入,所以我选择 7.1.0、x86_64、win32、seh 和 0 选项。 我在 eclipse c++ 构建环境中包含了新 mingw64 文件夹的路径,并且我能够在新项目中选择“mingw gcc”工具链并成功运行新的 helloworld 项目。

然后我尝试按照https://www.caveofprogramming.com/c-for-complete-beginners/setting-up-sdl-windows.html 中的步骤添加 SDL2。我从 libsdl 下载页面获得最新版本 SDL 2.0.5,选择 MinGW 32/64 位版本的开发库。然后我解压缩它,选择 x86_64-w64-mingw32 版本并将 lib / include 文件(包括 cmake 和 pkgconfig 子文件夹)从该文件夹移动到之前的新 mingw64 文件夹。

此时我处于教程的第 6 步;我继续其余的没有任何问题(在第 17 步,我添加了相同的 mingw32 / SDL2main / SDL2 链接器:这是正确的吗?),一旦项目构建,将 SDL2.dll 从初始 SDL2\bin 文件夹添加到调试文件夹。但是,当我复制他的示例代码并使用调试器单步执行时,在 SDL_Init(SDL_INIT_EVERYTHING); 处发生错误。我无法进入。它不会在控制台上输出任何东西,looks like this in the debugger,当我尝试恢复时,程序停止工作并终止。没有错误代码或任何东西。

我发现的最相关的解决方案总是涉及对所有内容使用 32 位,但是使用上述的 32 位版本重复上述过程会在同一个地方导致相同的错误。我查看了 SDL wiki 并尝试了 SDL_INIT 的所有可能输入:当我尝试 SDL_INIT_TIMER、SDL_INIT_JOYSTICK 和 SDL_INIT_GAMECONTROLLER 时,它以相同的方式崩溃,但其他输入没有导致任何错误。我最终想像以前做的项目一样使用 SDL_image 和 SDL_tff,而且我知道我想出了一种方法来让它工作,但我无法重现。

【问题讨论】:

  • 更新:我能够完全完成willusher.io/pages/sdl2 的教程,因此 sdl 窗口会出现并输出我想要的任何内容。我不能做 SDL_INIT_EVERYTHING 或提到的其他 init 宏,但 SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_EVENTS) 不会导致任何错误,至少到目前为止,我可以做我需要做的事情。

标签: c++ windows eclipse mingw sdl-2


【解决方案1】:

您必须使用#include <SDL2/SDL.h> 才能使用。

另外,我建议不要使用using namespace std;,因为如果您的代码进一步开发,它会产生问题。其次,我强烈建议使用 块来处理异常,没有它们,当错误发生时,你将不知道它来自哪里。

这是一个例子:

#include <stdexcept>

try
{
if (SDL_Init(SDL_INIT_VIDEO) > 0)
  {
    throw(::std::runtime_error("SDL failed to initialise! ERROR: "));
  }
}
catch (std::runtime_error const& msg)
{
    printf("%s", msg.what());
    if (SDL_GetError() != NULL)
    {
        printf("%s", SDL_GetError());
    }
}

【讨论】:

  • 尝试 会导致“没有这样的文件或目录”,它在 Caveofprogramming 教程步骤 18-22 中解释了我认为应该如何工作。d
  • 我知道使用命名空间 std 是不好的做法,它只是默认打开 helloworld 项目代码来证明它完全有效。删除 std 命名空间会导致相同的错误。
  • 添加try-catch块并不会在错误发生时捕捉到错误,它仍然会导致SDL_INIT的异常并且不会继续调试
【解决方案2】:

非常不确定这是否是实际的解决方案,但是使用自定义选项 7.1.0、x86_64、posix、sjlj 和 0 重新安装 mingw 使得 INIT_EVERYTHING 可以正常工作而不会崩溃,并且完全按照应有的方式执行。

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2013-05-30
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多