【问题标题】:SDL2 test works only when i start without debuggingSDL2 测试仅在我没有调试的情况下启动
【发布时间】:2014-05-11 04:52:14
【问题描述】:

我正在尝试从lazyfoo.net 学习 SDL2,但我遇到了很多问题(我从一月份开始也一直在学习 c++,所以我知道发生了什么,但不是全部),第一个最明显的一个是“Hello world”仅在我没有调试的情况下开始出现,如果我进行调试,它会给我“程序无法启动,因为您的计算机中缺少 SDL2.dll”。这根本不是真的。我将 .dll 文件放入我当前项目的文件夹(我称之为 TEST),该站点只是告诉我将它放在与 .vxcproj 文件相同的区域中,这就是我所做的......

教程还告诉我输入#include <SDL.h>,当我这样做时,它说很多东西是未定义的(我只是直接从教程页面底部的 zip 文件中复制并粘贴了它),所以我必须使用#include <SDL2/SDL.h>

第三个(我设法修复,排序)是当将图像放到屏幕上时,它显示它找不到 .bmp 文件,所以我必须将文件放入源文件部分视觉工作室。它适用于这个测试,但如果我开始合并多个 .bmp 文件,它可能会变得混乱。我应该这样做吗?

这是我的代码,和压缩包里的几乎一模一样

#include <SDL2/SDL.h> //first modification i did
#include <stdio.h>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

bool init();
bool loadMedia();
void close();

SDL_Window* gWindow = NULL;
SDL_Surface* gScreenSurface = NULL;
SDL_Surface* gHelloWorld = NULL;

bool init()
{
    bool success = true;

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
        success = false;
    }
    else
    {
        gWindow = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if (gWindow == NULL)
        {
            printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
            success = false;
        }
        else
        {
            gScreenSurface = SDL_GetWindowSurface(gWindow);
        }
    }
    return success;
}

bool loadMedia()
{
    bool success = true;

    gHelloWorld = SDL_LoadBMP("hello_world.bmp"); //second modification
    if (gHelloWorld == NULL)
    {
        printf("Unable to load image %s! SDL Error: %s\n", "hello_world.bmp", SDL_GetError());
        success = false;
    }
    return success;
}
void close()
{
    SDL_FreeSurface(gHelloWorld);
    gHelloWorld = NULL;

    SDL_DestroyWindow(gWindow);
    gWindow = NULL;

    SDL_Quit();
}
int main(int argc, char* args[])
{
    if (!init())
    {
        printf("Failed to initialize!\n");
    }
    else
    {
        if (!loadMedia())
        {
            printf("Failed to load media!\n");
        }
        else
        {

            SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);
            SDL_UpdateWindowSurface(gWindow);
            SDL_Delay(2000);
        }
    }
    close();

    return 0;
}

【问题讨论】:

  • 您使用的是什么操作系统和 IDE?我猜你正在使用 Visual Studio。那么您的输出文件夹可能与您的工作目录不同(我总是将工作目录设置为输出文件夹)。您需要工作目录中的 DLL。关于包含目录:您在包含路径中添加了什么?

标签: c++ sdl sdl-2


【解决方案1】:

嗯嗯 您的问题:

1

我也很困扰,最好使用#include,如果你把这些东西放在头文件中会更好,比如stdafx或者你的类的头文件,这样可以减少混乱,有很大的机会您在集成目录时搞砸了 + 您的 .dll 不在一个好地方。

2

您应该将所有 dll 放入主项目的 debug 文件夹,即您可以看到 exe、.pdb 和 .ilk 的区域。

3

您使用了“hello_world.bmp”,这没有什么问题,它是您文件的位置,如果您要运行调试,则将文件(.bmp)放入其中...假设您创建了一个名为ABC,并将其放在名为 ABC 的文件夹中,将有 3 个文件夹,分别名为 DEBUG(如果您至少运行一次调试)、ipch 和 ABC。

您应该将文件放在包含 .vcxproj 和其他内容的 ABC 文件夹中,然后如果您想使用主文件夹的调试文件夹中的 .exe 文件运行游戏,那么您应该复制您使用的所有文件(在这种情况下,您使用 .bmp)并将它们粘贴到该文件夹​​中,该文件夹包含 .exe,这样如果您运行调试,它将在 ABC 文件夹中读取,而如果您亲自去到 .exe 文件,它会读取它所在文件夹中的文件。

【讨论】:

    【解决方案2】:

    @Skalli 他清楚地说明了 Visual Studio,这意味着他正在运行 Windows,

    请在合并图像时,将它们放在与您在使用发布模式时构建的 exe 相同的目录中。查看 SDL 库文件,转到 bin 并复制 SDL2.dll 并将其放在您的 EXE 所在的位置。此外,为了能够从 IDE 运行程序,转到 Program Files x86 文件夹并转到 IDE 文件夹,应将其命名为“Microsoft Visual Studio XX”并转到 bin 并粘贴 SDL2.dll

    如果问题仍然存在,请评论我的回答

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 2018-01-11
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2014-12-26
      相关资源
      最近更新 更多