Компиляция SDL2 с кодом Visual Studio - PullRequest
0 голосов
/ 14 июня 2019

Я пытался настроить среду C ++ для кода Visual Studio, которая работала, пока я не попытался использовать с ним SDL2.Я использую компилятор "g ++", который включен в mingw64.Я загрузил библиотеку разработки SDL2.09 для mingw.Я скопировал и вставил все файлы заголовков в папку include (это правильно, так как я не получаю ошибок о невозможности найти файл заголовка) и вставил библиотеки libs в папку libs (компилятор также может их найти),Я также скопировал и вставил DLL в каталог, в котором я компилировал код.Затем я собрал программу и продолжал получать ошибки.В зависимости от порядка библиотек, иногда случалось так, что есть несколько определений «main» или что-то в winMain.Иногда говорилось, что куча SDL не определена.Тем не менее, каждый раз, когда я запускал его, было последовательно то, что когда я использовал SDL_init или любую функцию SDL, он говорил, что ссылка не определена.

Я уже включил добавление библиотеки mingw32 вместе с другими библиотеками.Я также попытался изменить порядок библиотек, который получает различные результаты разных сообщений об ошибках, но ничего не получилось.Я попытался выполнить такую ​​же настройку в eclipse ide с теми же сообщениями об ошибках.

  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "g++_sdl2_build",
      "command": "D:\\Coding\\mingw64\\bin\\g++.exe",
      "args": [
        "-lmingw32",
        "-lSDL2main",
        "-lSDL2",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe",
        "-w"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    },
    {
      "type": "shell",
      "label": "g++.exe build active file",
      "command": "D:\\Coding\\mingw64\\bin\\g++.exe",
      "args": [
        "-g",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "D:\\Coding\\mingw64\\bin"
      }
    }
  ]
}

^^^ - это мой файл tasks.json, в котором находится файл сборки.

#include <sdl.h>
#include <iostream>

using namespace std;

int main(int argc, char *args[])
{
      if (SDL_Init(SDL_INIT_VIDEO) < 0)
      {
            cout << "SDL init failed" << endl;
            return 1;
      }

      cout << "SDL init successful" << endl;

      SDL_Quit();
      return 0;
}

^^ - это мой cpp-файл, который я пытался скомпилировать

Одна ошибка после попытки сборки:

D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/SDL2main.lib(x64/Release/SDL_windows_main.obj):(.text[main]+0x0): multiple definition of `main'
D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x0): first defined here
C:\Users\YARHAR~1\AppData\Local\Temp\ccBO9BFb.o: In function `SDL_main':
d:/Coding/Github/cpp_coding/SDL_testing/sdl_test.cpp:8: undefined reference to `SDL_Init'
d:/Coding/Github/cpp_coding/SDL_testing/sdl_test.cpp:16: undefined reference to `SDL_Quit'
collect2.exe: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

Другие ошибки после переключения порядка библиотек SDL2 и SDL2main:

D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/SDL2main.lib(x64/Release/SDL_windows_main.obj):(.text[main]+0x0): multiple definition of `main'
D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x0): first defined here
D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/SDL2main.lib(x64/Release/SDL_windows_main.obj):(.text[OutOfMemory]+0x1a): undefined reference to `SDL_ShowSimpleMessageBox'
D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/SDL2main.lib(x64/Release/SDL_windows_main.obj):(.text[main_getcmdline]+0xe4): undefined reference to `SDL_SetMainReady'
D:/Coding/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/lib/../lib/SDL2main.lib(x64/Release/SDL_windows_main.obj):(.text[main_getcmdline]+0x131): undefined reference to `SDL_ShowSimpleMessageBox'
C:\Users\YARHAR~1\AppData\Local\Temp\ccOsF7gq.o: In function `SDL_main':
d:/Coding/Github/cpp_coding/SDL_testing/sdl_test.cpp:8: undefined reference to `SDL_Init'
d:/Coding/Github/cpp_coding/SDL_testing/sdl_test.cpp:16: undefined reference to `SDL_Quit'
collect2.exe: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

Наилучший возможный случай ошибки - это когда в файл сборки я не включаю библиотеку mingw32, а также порядок библиотек: SDL2main и SDL2.В результате появляются следующие ошибки:

C:\Users\YARHAR~1\AppData\Local\Temp\ccjAeK0z.o: In function `SDL_main':
d:/Coding/Github/cpp_coding/SDL_testing/sdl_test.cpp:8: undefined reference to `SDL_Init'
d:/Coding/Github/cpp_coding/SDL_testing/sdl_test.cpp:16: undefined reference to `SDL_Quit'
collect2.exe: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

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

...