Miałem kilka problemów z kompilacją Assimp-a (biblioteka do ładowania modeli 3D) i nie mogłem nigdzie znaleźć odpowiedzi, także pomyślałem, że się podziele rozwiązaniem.
Nie wiem dlaczego, ale w kodzie źródłowym Assimpa brakowało jednego pliku. Akurat tego zawierającego komendy preprocesora dla kompilacji na MinGW (a właściwie nie tylko MinGW - po prostu jakiegolwiek z poza grupy kilku najpopularniejszych). Fragment kodu w Portability.cpp wygląda tak:
/* include platform specific config */
#if defined(__BORLANDC__)
# include <cppunit/config/config-bcb5.h>
#elif defined (_MSC_VER)
# if _MSC_VER == 1200 && defined(_WIN32_WCE) //evc4
# include <cppunit/config/config-evc4.h>
# else
# include <cppunit/config/config-msvc6.h>
# endif
#else
# include <cppunit/config-auto.h> // Tego brakuje
#endif
Kompilator oczywiście upomina się o config-auto.h. Domyśliłem się, że config-auto, podobnie jak cała reszta plików config-(...), zawiera całą mase dziwnych #define-ów dla kompilatora, które pewnie jakoś sterują procesem kompilacji dla konkretnej platformy i pewnie w każdym projekcie wygląda tak samo. Także prędzej czy później znalazłem w Google config-auto.h na githubie Blackberry :| Miałem wątpliwości czy to zadziała, bo podobno wygenerowany na Linuxie, no ale działa - tzn. nie tylko się kompiluje - faktycznie działa.
https://github.com/blackberry/CppUnit/blob/master/include/cppunit/config-auto.h
Kolejny, dość dziwny problem był w pliku Main.cpp. Siedział tam sobie taki kod:
aiAttachLogStream(&aiGetPredefinedLogStream(
aiDefaultLogStream_FILE,
"AssimpLog_C.txt"));
W wywołaniu aiAttachLogStream jest tworzony obiekt i od razu przekazywany do niego adres. Tylko, że... ten adres zostanie pobrany, a obiekt zniknie po zakończeniu funkcji. Być może obiekt był potrzebny tylko ten jeden raz, ale kompilator słusznie zwraca uwage "taking address of temporary". Dość dziwne, że coś takiego znalazło się w kodzie sporej biblioteki. Anyway - wystarczy lekko zmienić kod:
aiLogStream myLogStream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE, "AssimpLog_C.txt");
aiAttachLogStream(&myLogStream);
Po tych dwóch zmianach kompilacja przebiegła jak trza i wszystko ładnie działa.