У меня есть приложение, которое отлично работает в Ubuntu, но сразу же закрывается при запуске БЕЗ КАКИХ-ЛИБО ОШИБОК в Windows.
Кажется, что функция main() не введена.
Приложение скомпилировано без ошибок и использует SDL_image.h. Когда (в том же приложении) код, использующий SDL Image, отсутствовал, приложение работало нормально.
В каталоге .exe есть все необходимые dll, SDL2.dll, libjpeg-9.dll, libpng16-16.dll, libtiff-5.dll, libwebp-7.dll, SDL2_image.dll и zlib1.dll.
IMG_Init() вызывается перед любыми другими функциями изображения следующим образом:
(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG)
и, как я уже говорил, это приложение работает без проблем в Ubuntu.
Это воспроизводимый пример.
Этот код работает:
makefile
CC = gcc -fno-pie -no-pie -m32
CFLAGS = -IC:/sdl2/include -O0 -ggdb
LIBS = -LC:/sdl2/lib/x86 -lSDL2main -lSDL2
all:
$(CC) $(CFLAGS) main.c $(LIBS) -o application.exe
main.c
#include <stdio.h>
#include "SDL.h"
int main(int argc, char **argv)
{
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
{
SDL_Log("SDL fails to initialize video subsystem!\n%s", SDL_GetError());
return -1;
}
else
printf("SDL Video was initialized fine!\n");
return 0;
}
Этот код, где я использую библиотеку изображений SDL, ничего не делает, без ошибок, сразу завершает работу:
makefile
CC = gcc -fno-pie -no-pie -m32
CFLAGS = -IC:/sdl2/include -IC:/sdl2_image/include -O0 -ggdb
LIBS = -LC:/sdl2/lib/x86 -LC:/sdl2_image/lib/x86 -lSDL2main -lSDL2 -lSDL2_image
all:
$(CC) $(CFLAGS) main.c $(LIBS) -o application.exe
main.c
#include <stdio.h>
#include "SDL.h"
#include "SDL_image.h"
int main(int argc, char **argv)
{
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
{
SDL_Log("SDL fails to initialize video subsystem!\n%s", SDL_GetError());
return -1;
}
else
printf("SDL Video was initialized fine!\n");
if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG)
{
SDL_Log("SDL fails to initialize image handler!\n%s", IMG_GetError());
return -1;
}
else
printf("SDL Image was initialized fine!\n");
return 0;
}
Как я уже говорил, кажется, что проблема в библиотеке Windows (или в среде), и именно поэтому я не добавил воспроизводимый код раньше.
Через 2 дня нашел решение.
Прежде всего (но это не моя проблема) библиотека SDL Image не такая уж "умная", поэтому важно, чтобы библиотека SDL2_image.dll и используемые из libjpeg-9.dll, libpng16-16.dll, libtiff- 5.dll, libwebp-7.dll и zlib1.dll присутствуют. Вы не получите никакой ошибки, если одна из необходимых библиотек отсутствует.
У меня была проблема в моей среде, на этой машине я использую Visual Studio и Eclipse. Я сделал ошибку, и мой makefile указывал на библиотеки Visual Studio SDL, а не на MinGW.
Я не знаю почему, но первый воспроизводимый пример прекрасно работает и с этой ошибкой (и без -lmingw32), так что он указал мне неверный путь.
Я сделал это изменение в make-файле, и теперь оно работает:
CFLAGS = -IC:/sdl2_mingw/i686-w64-mingw32/include/SDL2 -IC:/sdl2_image_mingw/i686-w64-mingw32/include/SDL2 -O0 -ggdb
LIBS = -lmingw32 -LC:/sdl2_mingw/i686-w64-mingw32/lib -LC:/sdl2_image_mingw/i686-w64-mingw32/lib -lSDL2main -lSDL2 -lSDL2_image