es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SDL2, C++, MinGW64: referencia no definida a ‘WinMain@16’

He estado intentando configurar SDL2 con MinGW, pero me he encontrado con este error repetidamente:

c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): referencia sin definir a `WinMain@16′

He intentado agregar “#define SDL_HANDLED_MAIN” al principio de main.cpp, y sí funciona, sin embargo, me gustaría saber cómo podría hacer que esto funcione usando el sistema de SDL y no evadiéndolo.

Enlaces (en orden): -lmingw32 -lSDL2main -lSDL2 -lSDL2_image

Código:
“`
#include <sdl2 sdl.h="">
#include <sdl2 sdl_image.h="">
#include <iostream>

int main(int argc, char **)
{
std::cout << "¡Hola Mundo!" << std::endl;
std::cin.get();
return 0;
}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el vinculador no puede encontrar la función WinMain. Esta función es generalmente el punto de entrada para las aplicaciones GUI de Windows. Para solucionar este problema, puedes cambiar tu función main por la función WinMain:

    #include <sdl2 sdl.h="">
    #include <sdl2 sdl_image.h="">
    #include <iostream>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        // Inicializa SDL2 y SDL2_image
        if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
        {
            std::cerr << "Error al inicializar SDL: " << SDL_GetError() << std::endl;
            return 1;
        }
    
        if (IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG) != (IMG_INIT_JPG | IMG_INIT_PNG))
        {
            std::cerr << "Error al inicializar SDL_image: " << IMG_GetError() << std::endl;
            SDL_Quit();
            return 1;
        }
    
        std::cout << "¡Hola mundo!" << std::endl;
        std::cin.get();
    
        // Limpia SDL2 y SDL2_image
        IMG_Quit();
        SDL_Quit();
    
        return 0;
    }
    

    Ten en cuenta que la función WinMain toma cuatro argumentos: HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine y int nCmdShow. No necesitas usar estos argumentos, pero debes declararlos y nombrarlos para evitar errores del vinculador.

    También ten en cuenta que necesitas inicializar SDL2 y SDL2_image antes de usarlos. El código de ejemplo inicializa SDL2 y SDL2_image usando las funciones SDL_Init e IMG_Init, respectivamente. También necesitas limpiar SDL2 y SDL2_image usando las funciones SDL_Quit e IMG_Quit, respectivamente.

Comments are closed.