视觉C++ 将SDL_ttf与 SDL 和 SDL2 一起使用时出现访问冲突

visual C++ Access violation when using SDL_ttf with SDL and SDL2

本文关键字:SDL 一起 访问冲突 C++ ttf 视觉 SDL2      更新时间:2023-10-16

我正在将SDL2_ttf与SDL2一起使用(在Visual Studio 2015中)。当我尝试运行以下代码时,

#include "SDL.h"
#include "SDL_ttf.h"
int main(int argc, char* args[]) {
    SDL_Init(SDL_INIT_EVERYTHING);
    TTF_Init();
    SDL_Window* window;
    SDL_Renderer* renderer;
    SDL_CreateWindowAndRenderer(1600, 900, SDL_WINDOW_OPENGL, &window, &renderer);
    TTF_Font* font = TTF_OpenFont("comic.ttf", 12);
    SDL_Color color = { 0, 0, 0, 255 };
    SDL_Surface* textSurface = TTF_RenderText_Solid(font, "asdf", color);
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, textSurface);
    TTF_Quit();
    SDL_Quit();
    return 0;
}

我收到"SDL.dll丢失"运行时错误。我将 SDL.dll 与 SDL2.dll、libfreetype-6.dll、SDL_ttf.dll、zlib1.dll 和其他库放在我的 system32 文件夹中,这解决了运行时错误,但我立即遇到了另一个错误:"MCP2016.exe 中0x000000006C812E39 (SDL2.dll) 未处理的异常:0xC0000005:访问冲突读取位置0x000000010000006A。

当我决定在Visual Studio对话框中"中断"告诉我这一点时,它指向了这条线。

SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, textSurface);

我遇到了一个旧的论坛帖子,建议SDL_ttf和 SDL2 可能会导致这样的访问冲突,因为它们不完全兼容。我认为这与我遇到的问题有关,因为它首先抱怨 SDL.dll。有人建议使用 SDL2 头文件重新编译 DLL,但恐怕这超出了我的能力范围,特别是因为 Windows 和 C++ 相处得不是很好。

我已经为此工作了大约八个小时,我已经没有想法来尝试解决这个问题了。有人对此有任何想法吗?

SDL 和 SDL2 不兼容。你要么有一个,要么另一个。

如评论中所述,解决方法是改用SDL2_ttf。