Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

damyan94 avatar damyan94 9 Точки

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 373 Точки

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

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

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

 

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

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

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

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

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

echo %PATH% на command promp-a.

 

Поздрави

 

0
damyan94 avatar damyan94 9 Точки

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

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 373 Точки

Привет, 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 9 Точки

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

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.