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 някъде по кода и ако да, то как на Линукс сработва, а на Уиндоус - не?
Тук качих трите файла (извинявам се за китайския линк).
CMakeOutput.log
CMakeError.log
CMakeLists.txt
Всичко е инсталирано директно на диска C:\, като echo %PATH% връща абсолютно същите пътища:
C:\MinGW\bin;
c:\cmake\bin;
C:\mingw_dev_libs\bin;
Привет, 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 папката и пробвай горната команда.
Поздрави
Така де, сработи да крашне успешно :Д. Благодаря, този път с допълнението -DCMAKE_CXX_COMPILER="C:/MinGW/bin/g++.exe стана, успя да намери правилния компилатор и вече нямам CMakeError.log. Обаче, пак при cmake --build . дава същите грешки за undefined refference. Във вторник ще пробвам с качения код, дано така стане, иначе ще работи само на Линукс засега.
Ами всичко изглежда нормално.
Би ли споделил вече output-a на минаващата успешно CMake генерация.
Искам да видя къде и какво се намира като библиотеки.
Ако трябва да гадая каква е грешката подозирам, че имаш нещо объркано специално в сетването на SDL библиотеките.
Прегледай този 5-10 мин интервал от SDL Installation Guidelines видеото и го повтори.
Може нещо там да се е объркало.
Например да си копирал 64 битовите библиотеки като в случая ти трябват 32 битовите.
Или да си свалил MSVC библиотеките, а не тези за MInGW.
Или да не си копирал нещо - знам ли.
Обърни специално внимания на папките lib и bin.
include папката явно ти е ОК щом ти минава компилацията.
Поздрави
CmakeOutput.log
Днес пробвах на друг компютър абсолютно копи-пейст на всички вече инсталирани файлове от проблемния компютър и там сработи. Извинявам се за дебилната ситуация, явно е до самия компютър.
Привет,
Радвам се, че си разрешил проблема.
Принципно няма накова нещо като "от компютъра е".
По-скоро има нещо "счепено" на ниво компилатор или ОС.
В най-лошия случай преинсталация ще помогне.
Затова и в началото на керса дадох възможност да ползвате Windows под виртуална машина.
Поздрави