Компиляция с 64-битным MinGW на Code :: Blocks - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь настроить установку Code :: Blocks для работы с графическим API SDL2. Как видно из документации, после того, как я все установил и правильно указал, я попробовал тест SDL_Init(SDL_INIT_EVERYTHING), как:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <SDL2/SDL.h>

int main (int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        printf("\nSDL2 could not be initialized! Code: %s\n", SDL_GetError());
    }

    return EXIT_SUCCESS;
}

Однако я получил следующие ошибки:

...in function 'SDL_Main':
undefined reference to `SDL_Init`
undefined reference to `SDL_GetError`
undefined reference to 'WinMain@16'

Я посмотрел на эти ошибки, и они, кажется, происходят из-за того, что CodeBlocks используют 32-битный компилятор, но я использую 64-битную библиотеку SDL2. Это имеет смысл, так как мои связанные параметры:

-lmingw32 -lSDL2main -lSDL2

Итак, я использовал инструмент MinGW WinBuilds для загрузки 64-битного форка MinGW, который дал мне огромное количество файлов в новом /mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/... папка. Затем я перешел к CodeBlocks Settings -> Compiler -> Toolchain Executables и указал соответствующие исполняемые файлы компилятора на исполняемый файл в bin. Моей первой мыслью было изменить -lmingw32 на -lmingw64, но это не сработало. Я получаю ошибку:

cannot find -lmingw64

На данный момент я не уверен, что я сделал правильно, неправильно, что сломано / работает и т. Д. c. и был бы очень признателен за любую возможную помощь.

Стоит также отметить, что я извлек 64-битный компилятор в C:\MinGW и указал CodeBlocks на C:\MinGW\bin в качестве каталога установки компилятора. Когда я нажимаю Auto-Detect, он кажется достаточно счастливым и заявляет, что автоматически обнаружил компилятор G CC в этом месте. Следовательно, это должен быть мой неправильный флаг -lmingw64 или что-то еще, что я указал.

Редактировать: 64-разрядный компилятор был настроен и обнаружен правильно, но продолжал выдавать ошибки, относящиеся к SDL функции:

||=== Build: Debug in Initialization_Test (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `SDL_main':|
C:\C\SDL_C_Graphics\Init_Test\Initialization_Test\main.cpp|8|undefined reference to `_SDL_Init'|
C:\C\SDL_C_Graphics\Init_Test\Initialization_Test\main.cpp|10|undefined reference to `_SDL_GetError'|
C:\C\SDL_C_Graphics\Init_Test\Initialization_Test\main.cpp|10|undefined reference to `_printf'|
obj\Debug\main.o||In function `__tcf_0':|
c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\iostream|74|undefined reference to `__ZNSt8ios_base4InitD1Ev'|
obj\Debug\main.o||In function `__static_initialization_and_destruction_0':|
c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\iostream|74|undefined reference to `__ZNSt8ios_base4InitC1Ev'|
c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\iostream|74|undefined reference to `_atexit'|
C:\SDL_Dev\SDL2-2.0.12\x86_64-w64-mingw32\lib\libSDL2main.a(SDL_windows_main.o)||In function `main_getcmdline':|
\Users\valve\release\SDL\SDL2-2.0.12-source\foo-x64\..\src\main\windows\SDL_windows_main.c|71|undefined reference to `SDL_main'|
||error: ld returned 1 exit status|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Команды CodeBlocks могут выполняться для компиляции, в отдельном окне журнала:

x86_64-w64-mingw32-g++.exe -LC:\SDL_Dev\SDL2-2.0.12\x86_64-w64-mingw32\lib -LC:\SDL_Dev\SDL2-2.0.12\x86_64-w64-mingw32\lib -LC:\SDL_Dev\SDL_Img\SDL2_image-2.0.5\x86_64-w64-mingw32\lib -LC:\SDL_Dev\SDL_Mixer\SDL2_mixer-2.0.4\x86_64-w64-mingw32\lib -L"C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\lib" -o bin\Debug\Initialization_Test.exe obj\Debug\main.o  -lmingw32 -lSDL2main -lSDL2  -lmingw32 -lSDL2main -lSDL2.dll -luser32 -lgdi32 -lwinmm -ldxguid
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `obj\Debug\main.o' is incompatible with i386:x86-64 output

1 Ответ

1 голос
/ 17 марта 2020

ОБНОВЛЕНИЕ Ваше последнее редактирование показывает самый важный бит вывода (это, кстати, также первая часть вывода):

C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `obj\Debug\main.o' is incompatible with i386:x86-64 output

Этот компоновщик говорит вам, что вы смешивание 32 и 64-битных двоичных файлов. Кажется, вы скомпилировали исходный файл main.cpp в 32-битный двоичный объект obj\Debug\main.o. Вам нужно будет предоставить команды, ведущие к созданию этого файла.


Некоторые общие замечания:

  1. Последний символ WinMain@16 - это точка входа Windows -specifi c, которую вы «запрашиваете» путем компиляции / компоновки с -mwindows, и это типично / необходимо для собственного приложения Win32 GUI. Кажется также, что ссылка SDL2main «вызывает» это.

  2. «32», которые вы видите в различных системных библиотеках и префиксах компилятора, отражает целевой API, который называется « Win32 ", даже на 64-битной Windows.

В отношении информации об ошибке, которую вы разместили:

Неопределенные ссылки на символы C ++ подразумевают, что вы связываетесь с gcc, но вместо этого должно быть соединение с g++, которое автоматически связывает нужные вам биты C ++. Эти пропущенные символы необходимы, потому что вы включили <iostream>, что приводит к некоторой глобальной инициализации.

Я не могу воспроизвести ошибку компоновщика с помощью сборки MSYS2 SDL2. Ваш тестовый код дает мне следующий вывод:

g++ main.cpp -o sdl_test -lSDL2main -lSDL2
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): in function `main':
D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status

, для которого я могу вернуться к моей точке 1 выше. Но это не ваша проблема, так как он впервые жалуется на символы SDL.

...