неопределенная ссылка на SDL_Init

Я начал использовать SDL сегодня, и раньше у меня были некоторые проблемы, теперь я запустил его, но он не позволяет мне его запустить.

Это мой код:

#include <iostream>
#include "SDL.h"
#undef main

using namespace std;

int main(){
    if(SDL_Init(SDL_INIT_EVERYTHING)<0){
        cout << "error starting sdl" << endl;
    }
    return 0;
}

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

-------------- Build: Debug in Graphics (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -g -std=c++11 -IC:\Users\73638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 -I"C:\Users\73638G75MA\Documents\C++ projects\Graphics" -c "C:\Users\73638G75MA\Documents\C++ projects\Graphics\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\73638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\lib -o bin\Debug\Graphics.exe obj\Debug\main.o  -lmingw32 -lSDL2main -lSDL2  
obj\Debug\main.o: In function `main':
C:/Users/73638G75MA/Documents/C++ projects/Graphics/main.cpp:8: undefined reference to `SDL_Init'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

Я был бы признателен за любую возможную помощь в этом, главное #undef в начале, потому что иначе оно не позволит мне запустить его. Если его там нет, он дает мне «неопределенную ссылку на winmain@16», пока я создаю консольное приложение.


person miquel09    schedule 09.05.2015    source источник


Ответы (4)


Судя по пути включения и поиска библиотеки ...\SDL2-2.0.3\x86_64-w64-mingw32\..., вы пытаетесь выполнить сборку с помощью 64-разрядного SDL2. Судя по имени компилятора mingw32-g++, я бы сказал, что вы используете цепочку инструментов mingw.org Согласно Code::Blocks страница загрузки и моя проверка содержимого codeblocks-13.12mingw-setup.exe, включенная цепочка инструментов является только 32-разрядной и не может создавать 64-разрядные двоичные файлы или использовать 64-битные библиотеки.

Если вы хотите использовать предварительно созданный SDL2, вам нужно либо загрузить соответствующий набор инструментов (64-разрядный mingw-w64) и использовать его, либо изменить параметры сборки, чтобы использовать 32-разрядную сборку SDL2 (она присутствует в архив библиотек разработки в каталоге i686-w64-mingw32).

person David Macek    schedule 11.05.2015

У вас тут несколько ошибок.

1.

Не сбрасывайте определение main только потому, что вы не знаете, зачем оно здесь! Когда вы используете SDL, main() (почти) всегда должно выглядеть как int main(int, char **) {}. Итак, удалите #undef main и замените int main() на int main(int, char **).

2.

Вы должны использовать содержимое i686-w64-mingw32 вместо x86_64-w64-mingw32 при сборке исполняемых файлов x32. Поэтому правильно настройте флаги компиляции.

x86_64-w64-mingw32, вероятно, для приложений x64, но я думаю, что вы создаете приложение x32.

person HolyBlackCat    schedule 11.05.2015

Следующее сработало для меня после некоторой тяжелой работы:

g++ -std=c++17 Test.cpp -I"include" -L"lib" -Wall -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -o Test

Некоторые важные вещи, о которых вы, возможно, не подозревали:

  • Флаги "-l" должны идти в конце.
  • Флаг "-lmingw32" должен быть там даже при использовании 64-битного компилятора mingw-w64. Знайте, что я не понимаю, почему, но что я пробовал, и без него не работает.
  • Ваша основная функция должна быть int main(int argc, char* argv[]) {, потому что SDL должен найти ее, чтобы вступить во владение.

Моя файловая структура выглядит следующим образом:

Test/
  include/
    SDL.h
    SDL_main.h
    SDL_image.h
    ...
  lib/
    libSDL2.a
    libSDL2.dll.a
    libSDL2_image.a
    ...
  licenses/
  Test.exe
  SDL2.dll
  SDL2_image.dll
  zlib1.dll
  Test.cpp
  sdl2-config

Обратите внимание, что у меня есть текущий каталог моей командной строки в Test.
Также обратите внимание, что у меня есть папка исполняемого файла mingw-w64 g++ в пути переменных среды.
Также обратите внимание, что ...s в приведенной выше структуре означают там должно быть больше, и они взяты из папки x86_64, предоставленной вам SDL.

person Dustin Morrison    schedule 06.11.2018

это сработало для меня .... перейдите в настройки-> компилятор-> настройки компоновщика-> в другом поле параметров компоновщика вставьте следующее -lmingw32 -lSDL2main -lSDL2

person Mohammed Bedru    schedule 28.06.2020
comment
пожалуйста, не забудьте указать код / ​​команды в своих ответах в code fences - person finnmglas; 28.06.2020