SDL_image Невозможно загрузить файл.png с помощью IMG_LoadTexture()
При попытке загрузить файл.png с помощью IMG_LoadTexture(renderer, "idle.png") SDL_GetError() говорит: "Не удалось открыть idle.png". Нет ошибок компилятора, появляется только черное окно.
Это мой main.cpp
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
int main(int argc, char** argv) {
SDL_Event event;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
SDL_Window *window = NULL;
SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(
800, 600,
0, &window, &renderer
);
IMG_Init(IMG_INIT_PNG);
texture = IMG_LoadTexture(renderer, "idle.png");
std::cout << SDL_GetError();
while (1) {
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
}
SDL_DestroyTexture(texture);
IMG_Quit();
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
}
Но я думаю, проблема в том, как я связываю библиотеку. Я установил sdl2, sdl2_image и libpng.
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(untitled)
set(CMAKE_CXX_STANDARD 17)
add_executable(untitled main.cpp)
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image>=2.0.0)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(untitled ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})
1 ответ
Решение
Вы загружаете изображение из текущего рабочего каталога (CWD) вашего приложения. Это не обязательно тот же каталог, в котором находится ваш исполняемый файл (это зависит от того, как он запускается), что вы, похоже, предполагаете.
3 простых способа исправить:
- измените cwd во время выполнения на то, где находится файл, и загрузите, как вы делаете сейчас.
- укажите абсолютный путь к файлу при загрузке, поэтому cwd не имеет значения.
- получить путь к исполняемому файлу во время выполнения и затем построить путь к файлу относительно того, где находится исполняемый файл. (На мой взгляд, лучший вариант, так как он устойчив против перемещения вашего проекта / установки в другое место).