Почему мой установщик MSYS2 / MinGW64 связывает SDL2 без директивы -l, но не SDL2_ttf? - PullRequest
0 голосов
/ 08 января 2019

У меня установлены MSYS2 и MinGW64. Я также установил Code :: Blocks и указал его конфигурацию набора инструментов на исполняемые файлы в бине MinGW64. Для поддержания чистоты я установил только библиотеки, использующие pacman из оболочки MinGW64.

$ pacman -Sl | grep SDL2
mingw32 mingw-w64-i686-SDL2 2.0.9-1
mingw32 mingw-w64-i686-SDL2_gfx 1.0.4-1
mingw32 mingw-w64-i686-SDL2_image 2.0.4-1
mingw32 mingw-w64-i686-SDL2_mixer 2.0.4-1
mingw32 mingw-w64-i686-SDL2_net 2.0.1-1
mingw32 mingw-w64-i686-SDL2_ttf 2.0.14-1
mingw64 mingw-w64-x86_64-SDL2 2.0.9-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_gfx 1.0.4-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_image 2.0.4-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_mixer 2.0.4-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_net 2.0.1-1 [installed]
mingw64 mingw-w64-x86_64-SDL2_ttf 2.0.14-1 [installed]

Используя Code :: Blocks, я могу скомпилировать и связать пример, который инициализирует SDL2, открывает окно и выходит из события SDL_Quit. В примере проекта НЕТ дополнительной конфигурации компилятора или компоновщика. На самом деле, глобальные настройки Code :: Blocks также не настраивают поисковые каталоги. Я полагаю, что в GCC есть INCLUDE и LIB уже установлены в среде по умолчанию.

Проблема возникает, когда я пытаюсь использовать SDL2_ttf. Я могу включить это, и Code :: Blocks находит это достаточно хорошо, чтобы предложить некоторое завершение кода. Но сборка не удалась по "неопределенной ссылке на TTF_Init".

-------------- Build: Debug in TV Tennis (compiler: GNU GCC Compiler)---------------

g++.exe -LD:\msys64\mingw64\lib -o "bin\Debug\TV Tennis.exe" obj\Debug\main.o   -lmingw32 -lSDL2main -lSDL2.dll -luser32 -lgdi32 -lwinmm -ldxguid
obj\Debug\main.o: In function `SDL_main':
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:45: undefined reference to `TTF_Init'
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:59: undefined reference to `TTF_OpenFont'
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:109: undefined reference to `TTF_CloseFont'
H:/Datacenter/Source/TVTennis/C++/TV Tennis/main.cpp:110: undefined reference to `TTF_Quit'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
5 error(s), 0 warning(s) (0 minute(s), 0 second(s))

Если я добавлю «-lSDL2_ttf» к параметрам компоновщика проекта, проблема исчезнет.

У меня вопрос: почему я получаю магию автоматического связывания для SDL2, а не для SDL2_ttf?

1 Ответ

0 голосов
/ 09 января 2019

Я узнал, как SDL2 был «магически» связан без какой-либо видимой конфигурации или явной директивы.

Когда я создал проект Code :: Blocks, я указал его как проект SDL2. Code :: Blocks затем добавляет группу библиотек в проект по умолчанию через файл проекта * .cbp (Code :: Blocks Project).

<Compiler>
    <Add option="-Wall" />
    <Add directory="D:/msys64/mingw64/include" />
</Compiler>
<Linker>
    <Add library="mingw32" />
    <Add library="SDL2main" />
    <Add library="SDL2.dll" />
    <Add library="user32" />
    <Add library="gdi32" />
    <Add library="winmm" />
    <Add library="dxguid" />
    <Add directory="D:/msys64/mingw64/lib" />
</Linker>
<ExtraCommands>
    <Add after="XCOPY $(#sdl2)\bin\*.dll $(TARGET_OUTPUT_DIR) /D /Y" />
</ExtraCommands>

Честно говоря, поэтому я ненавижу начинать с шаблонов проектов; особенно когда я новичок в языке, IDE или библиотеке. И в этом случае я новичок во всех трех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...