Невозможно связать функции SDL2 с помощью MinGW

Я относительно новичок в программировании, и я решил попробовать SDL, но я немного застрял. Я не смог построить проект в кодовых блоках, и я получаю ссылку "undefined" всем функциям SDL. Я видел здесь много подобных вопросов, но ни одно из решений, похоже, не помогает. Я уже добавил папки \include\SDL2 и\lib для поиска каталогов, я добавил SDL2Main и SDL2 для связывания библиотек в вариантах компоновщика, я даже добавил -mwindows в другие параметры компоновщика. Кроме того, я попытался установить связь с 64-разрядной версией, но все стало еще хуже.

Здесь мой исходный код, в значительной степени скопированный прямо из учебника, которое я начал:

#include <SDL.h>
SDL_Window* g_pWindow = 0;
SDL_Renderer* g_pRenderer = 0;
int main(int argc, char* args[])
    {
        // initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) >= 0)
    {
    // if succeeded create our window
        g_pWindow = SDL_CreateWindow("Chapter 1: Setting up SDL",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        640, 480,
        SDL_WINDOW_SHOWN);
        // if the window creation succeeded create our renderer
        if(g_pWindow != 0)
        {
            g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);
        }
    }
    else
    {
        return 1; // sdl could not initialize
    }
    // everything succeeded lets draw the window
    // set to black // This function expects Red, Green, Blue and
    // Alpha as color values
    SDL_SetRenderDrawColor(g_pRenderer, 0, 0, 0, 255);
    // clear the window to black
    SDL_RenderClear(g_pRenderer);
    // show the window
    SDL_RenderPresent(g_pRenderer);
    // set a delay before quitting
    SDL_Delay(5000);
    // clean up SDL
    SDL_Quit();
        return 0;
}

И вот журнал сборки:

mingw32-g++.exe -LC:\dev\sdl\SDL2-2.0.1\x86_64-w64-mingw32\lib  -o bin\Debug\GeometryProject.exe obj\Debug\main.o   -mwindows  C:\MinGW\lib\libmingw32.a C:\dev\sdl\SDL2-2.0.1\x86_64-w64-mingw32\lib\libSDL2main.a C:\dev\sdl\SDL2-2.0.1\x86_64-w64-mingw32\lib\libSDL2.a 
obj\Debug\main.o: In function `SDL_main':
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:7: undefined reference to `SDL_Init'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:13: undefined reference to `SDL_CreateWindow'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:17: undefined reference to `SDL_CreateRenderer'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:27: undefined reference to `SDL_SetRenderDrawColor'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:29: undefined reference to `SDL_RenderClear'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:31: undefined reference to `SDL_RenderPresent'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:33: undefined reference to `SDL_Delay'
C:/Users/Kris948/Desktop/ProjectsUni/GeometryProject/main.cpp:35: undefined reference to `SDL_Quit'
C:\MinGW\lib\libmingw32.a(main.o):main.c:(.text.startup+0xa7): undefined reference to `[email protected]'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
9 errors, 0 warnings (0 minutes, 0 seconds)

Есть ли что-нибудь еще, что я мог бы попробовать? Я действительно хотел бы получить эту работу и был бы признателен за любую помощь.

Ответ 1

Возможная проблема заключается в том, что ваша ссылка на библиотеку SDL2 для другой архитектуры.

Вы должны использовать

SDL2-2.0.1\i686-w64-mingw32

вместо

SDL2-2.0.1\x86_64-w64-mingw32

Также после установки пути поиска библиотеки используйте эту нотацию для ссылки на библиотеки

-lmingw32 -lSDL2main -lSDL2

Это намного легче читать.

Ответ 2

Вместо добавления полного пути попробуйте -LC:/PATH_TO_SDL -lSDL2main -lSDL2 (или только одну опцию SDL); lib и .a уже известны компоновщику.

(не уверен, что вам нужно использовать либо /, либо \)

Поскольку вы используете С++, замените include следующим:

extern "C"
{
    #include "SDL.h"
}

Это говорит компилятору рассматривать SDL как C -, а не С++ - код.

См. также: SDL2 не будет правильно связываться