Професионална програма
Loading...
damyan94 avatar damyan94 8 Точки

Build-ване на Уиндоус

Здравейте, опитвам да подкарам програмата от последното упражнение под Уиндоус след като успешно тръгна на Линукс. Командата cmake .. -G "MinGW Makefiles" сработва успешно, обаче при команда cmake --build . получавам грешки от рода на:

 

CMakeFiles\input_events.dir/objects.a(Engine.cpp.obj):Engine.cpp:(.text+0x76): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(Engine.cpp.obj):Engine.cpp:(.text+0xc7): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(Engine.cpp.obj):Engine.cpp:(.text+0x275): undefined reference to `SDL_UpperBlit'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0xf): undefined reference to `TTF_Init'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x33): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x61): undefined reference to `SDL_Init'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x85): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0xba): undefined reference to `IMG_Init'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0xe1): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x11d): undefined reference to `Mix_OpenAudio'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x13f): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x173): undefined reference to `IMG_Quit'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x178): undefined reference to `TTF_Quit'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x17d): undefined reference to `Mix_Quit'
CMakeFiles\input_events.dir/objects.a(SDLLoader.cpp.obj):SDLLoader.cpp:(.text+0x182): undefined reference to `SDL_Quit'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0x9e): undefined reference to `SDL_CreateWindow'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0xcf): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0x13f): undefined reference to `SDL_DestroyWindow'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0x173): undefined reference to `SDL_UpdateWindowSurface'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0x197): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0x1db): undefined reference to `SDL_GetWindowSurface'
CMakeFiles\input_events.dir/objects.a(MonitorWindow.cpp.obj):MonitorWindow.cpp:(.text+0x201): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(Texture.cpp.obj):Texture.cpp:(.text+0x23): undefined reference to `IMG_Load'
CMakeFiles\input_events.dir/objects.a(Texture.cpp.obj):Texture.cpp:(.text+0x54): undefined reference to `SDL_GetError'
CMakeFiles\input_events.dir/objects.a(Texture.cpp.obj):Texture.cpp:(.text+0xa9): undefined reference to `SDL_FreeSurface'
CMakeFiles\input_events.dir/objects.a(InputEvent.cpp.obj):InputEvent.cpp:(.text+0xf4): undefined reference to `SDL_PollEvent'
CMakeFiles\input_events.dir/objects.a(InputEvent.cpp.obj):InputEvent.cpp:(.text+0x118): undefined reference to `SDL_GetMouseState'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [CMakeFiles\input_events.dir\build.make:257: input_events.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/input_events.dir/all] Error 2

 

Изпълних всички стъпки от инструкцията за инсталиране на MinGW, cmake и библиотеките на SDL, има всички пътища в променливите на средата, зачистих папка build след като копирах проекта от Линукса, но не мога да открия причината за грешката и да я отстраня. В разни форуми четох, че това се случва и на други хора, но решенията, които предлагат там са отвъд капацитета ми за момента.

 

Възможно ли е да ми липсват някои include-и от SDL някъде по кода и ако да, то как на Линукс сработва, а на Уиндоус - не?

Тагове:
1
C++ Applications Development 13/10/2021 23:33:32
j.petrov_90 avatar j.petrov_90 313 Точки

Привет, колега,

Щом ти минава компилацията значи имаш налични include header-ите на SDL.

Това, което ти фейлва е линкера, който по някаква причина не може да намери имплементацията на SDL функциите (т.е. статичните SDL библиотеки.

 

Мога ли да те помоля да покажеш и output-a на CMake.

Вътре ще намериш и пътя до SDL библиотеките, където SDL ги е намерил.

Също така би било полезно да покажеш и самия CMake файл, както и мястото, където си инсталирал тези библиотеки.

Накрая, но не на последно място покажи какво имаш сетнато в PATH environment променливата.

Ако не се лъжа можеш да видиш това като напишеш

echo %PATH% на command promp-a.

 

Поздрави

 

0
damyan94 avatar damyan94 8 Точки

Тук качих трите файла (извинявам се за китайския линк).

CMakeOutput.log

CMakeError.log

CMakeLists.txt

 

Всичко е инсталирано директно на диска C:\, като echo %PATH% връща абсолютно същите пътища:

 

C:\MinGW\bin;
c:\cmake\bin;
C:\mingw_dev_libs\bin;

1
j.petrov_90 avatar j.petrov_90 313 Точки

Привет, damyan94,

Благозаря за информацията.
Другия път я включи още в началото за да помогнеш.
Help me to help you :)

Малко ми се разминават твърденията ти, че "cmake .. -G "MinGW Makefiles" сработва успешно" и факта, че показваш Cmake error log.
Няма значение.

В логовете виждам 2 "проблема".

Проблем 1:
Cmake е използвал "Ninja" като backend build система, а не "MinGW Makefiles".
Това може да се е породило от факта, че си опитал първо да ръннеш само "cmake ..", което е захапало default-тен build backend (в случая Ninja).
Веднъж вече "омацана" конфигурацията ти няма да сработи дори и да му рънваш "cmake .. -G "MinGW Makefiles"

Решение:
Изтрий съдържанието на папката build и пусни генерацията на ново. Този път със "cmake .. -G "MinGW Makefiles"

Проблем 2:
В логовете не виждам да се ползва MinGW компилатора.
Виждам обаче, че се намира MSVC (Microsoft Visual Studio compiler).
Ако наистина си инсталирал MinGW правилно - значи имаш 2 компилатора. В което няма нищо лошо.
В такъв случай просто трябва да кажеш на cmake, че искаш да ползваш MinGW, а не MSVC.
А защо да ползваш MinGW? Защото, ако си следвал SDL installation guidelines for Windows най-вероятно си иснталирал MinGW SDL библиотеките. Принципно в сайта на SDL има и такива за MSVC, но това е друга тема.

Сега по същия начин, по който казваме на cmake, че искаме специфичен генератор - ще му кажем, че искаме специфичен компилатор.

cmake .. -G "MinGW Makefiles" -DCMAKE_CXX_COMPILER="C:/MinGW/bin/g++.exe"

Зачисти съдържанието на build папката и пробвай горната команда.

Поздрави

1
17/10/2021 00:08:07
damyan94 avatar damyan94 8 Точки

Така де, сработи да крашне успешно :Д. Благодаря, този път с допълнението -DCMAKE_CXX_COMPILER="C:/MinGW/bin/g++.exe стана, успя да намери правилния компилатор и вече нямам CMakeError.log. Обаче, пак при cmake --build . дава същите грешки за undefined refference. Във вторник ще пробвам с качения код, дано така стане, иначе ще работи само на Линукс засега.

1
j.petrov_90 avatar j.petrov_90 313 Точки

Ами всичко изглежда нормално.
Би ли споделил вече output-a на минаващата успешно CMake генерация.
Искам да видя къде и какво се намира като библиотеки.

Ако трябва да гадая каква е грешката подозирам, че имаш нещо объркано специално в сетването на SDL библиотеките.
Прегледай този 5-10 мин интервал от SDL Installation Guidelines видеото и го повтори.
Може нещо там да се е объркало.

Например да си копирал 64 битовите библиотеки като в случая ти трябват 32 битовите.
Или да си свалил MSVC библиотеките, а не тези за MInGW.
Или да не си копирал нещо - знам ли.
Обърни специално внимания на папките lib и bin.

include папката явно ти е ОК щом ти минава компилацията.

Поздрави

0
17/10/2021 15:41:13