使用 eclipse 和 mingw 设置 SDL2:SDL_INIT 崩溃
Setting up SDL2 with eclipse and mingw: SDL_INIT crash
我一直在尝试重新运行 一个使用 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 文件夹的路径,并且我能够 select 新项目中的 '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,而且我知道我想出了一种方法让它工作但我无法重现。
您必须使用 #include <SDL2/SDL.h>
才能使用 sdl-2。
此外,我建议不要使用 using namespace std;
,因为如果您的代码进一步开发,它会产生问题。其次,我强烈建议使用 try-catch 块来处理异常,如果没有它们,当错误发生时,你将不知道它来自哪里。
这是一个例子:
#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());
}
}
非常不确定这是否是实际的解决方案,但是使用自定义选项 7.1.0、x86_64、posix、sjlj 和 0 重新安装 mingw 使 INIT_EVERYTHING 可以使用没有崩溃并完全按照应有的方式执行。
我一直在尝试重新运行 一个使用 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 文件夹的路径,并且我能够 select 新项目中的 '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,而且我知道我想出了一种方法让它工作但我无法重现。
您必须使用 #include <SDL2/SDL.h>
才能使用 sdl-2。
此外,我建议不要使用 using namespace std;
,因为如果您的代码进一步开发,它会产生问题。其次,我强烈建议使用 try-catch 块来处理异常,如果没有它们,当错误发生时,你将不知道它来自哪里。
这是一个例子:
#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());
}
}
非常不确定这是否是实际的解决方案,但是使用自定义选项 7.1.0、x86_64、posix、sjlj 和 0 重新安装 mingw 使 INIT_EVERYTHING 可以使用没有崩溃并完全按照应有的方式执行。