[Gelöst] Qt-LibAV-Programm: "undefined reference to `_Unwind_Resume'"
-
Liebe C++-Community,
Ich arbeite gerade an einem Programm, dass Audio-Dateien abspielt.
Zum Dekodieren verwende ich die LibAV und zum Abspielen der Audiodaten den QAudioOutput aus der Qt SDK.Das Ganze funktioniert sehr gut, solange ich nicht auf qmake angewiesen bin.
Wenn ich aber nun eine Klasse als abgeleitetes QObject deklariere und darin den QObject-Macro verwende, damit ich eigene Slots deklarieren kann, bin ich auf den Meta Object Compiler (MOC) angewiesen, d.h. ich muss qmake verwenden.Ich verwende 2 Source- und 1 Header-Datei, der Header sieht so aus:
#ifndef QLIBAV_AUDIOPLAYER_H #define QLIBAV_AUDIOPLAYER_H #include <QtCore\qbuffer.h> #include <QtCore\qobject.h> #include <QtGui\qapplication.h> #include <QtMultimedia\qaudiooutput.h> extern "C" { #include <libavutil\avutil.h> #include <libavformat\avformat.h> #include <libavcodec\avcodec.h> } class QLibAV_AudioPlayer : public QObject { Q_OBJECT private: QAudioFormat* Format; QAudioOutput* Output; QBuffer* Buffer; int GetAudio(char*, QByteArray*); public: QLibAV_AudioPlayer(); ~QLibAV_AudioPlayer(); int Play(char*); public slots: void Finished(QAudio::State); }; #endif // QLIBAV_AUDIOPLAYER_H
Da die LibAV-Bibliotheken in C99 geschrieben sind, binde ich die Header mit extern "C" ein, was bisher immer problemlos funktioniert hat.
Qmake benötigt zudem eine Qt-Projektdatei (*.pro), die bei mir so aussieht:
TEMPLATE = app TARGET = INCLUDEPATH += C:\\Users\\Michael\\Documents\\cpp_docs\\ffmpeg\\autobuilds\\libav-win32-20110918\\usr\\include LIBS = C:\\Users\\Michael\\Documents\\cpp_docs\\ffmpeg\\autobuilds\\libav-win32-20110918\\usr\\bin\\avformat.lib LIBS += C:\\Users\\Michael\\Documents\\cpp_docs\\ffmpeg\\autobuilds\\libav-win32-20110918\\usr\\bin\\avcodec.lib LIBS += C:\\Users\\Michael\\Documents\\cpp_docs\\ffmpeg\\autobuilds\\libav-win32-20110918\\usr\\bin\\avutil.lib HEADERS += qlibav_audioplayer.h SOURCES += main.cpp qlibav_audioplayer.cpp QT += multimedia
Als IDE verwende ich Code-Blocks und habe daher qmake in die Pre-build steps eingetragen und die Option "This is a custom Makefile" ausgewählt, als Compiler dient MinGW, das ganze unter Windows 7.
Das scheint so weit auch zu funktionieren und alles wird problemlos kompiliert, danach wird der Build aber mit folgenden Fehlermeldungen abgebrochen:||=== libav_5, Debug ===| c:\QtSDK\Desktop\Qt\4.7.3\mingw\lib\libqtmaind.a(qtmain_win.o)||In function `WinMain@16':| c:\ndk_buildrepos\qt-desktop\src\winmain\qtmain_win.cpp|93|undefined reference to `_Unwind_Resume'| c:\ndk_buildrepos\qt-desktop\src\winmain\qtmain_win.cpp|135|undefined reference to `_Unwind_Resume'| ..\..\..\..\..\..\ndk_buildrepos\qt-desktop\src\corelib\tools\qvector.h|484|undefined reference to `_Unwind_Resume'| ..\..\..\..\..\..\ndk_buildrepos\qt-desktop\src\corelib\tools\qvector.h|485|undefined reference to `_Unwind_Resume'| c:\QtSDK\Desktop\Qt\4.7.3\mingw\lib\libqtmaind.a(qtmain_win.o):qtmain_win.cpp:(.eh_frame+0x12)||undefined reference to `__gxx_personality_v0'| ||=== Build finished: 5 errors, 0 warnings ===|
Auf einigen Foren war zu lesen, dass Qt-Projekte grundsätzlich mit der selben MinGW-Version kompiliert werden müssen, wie die Qt-Bibliotheken selbst. Diese MinGW-Version ist in der Qt SDK enthalten.
Wenn ich aber die MinGW-Version aus der Qt SDK verwende, erhalte ich folgende Fehlermeldungen:debug\main.o||In function `Z5qMainiPPc':| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\main.cpp|5|undefined reference to `__gxx_personality_sj0'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\main.cpp|5|undefined reference to `_Unwind_SjLj_Register'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\main.cpp|16|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\main.cpp|25|undefined reference to `_Unwind_SjLj_Unregister'| debug\qlibav_audioplayer.o||In function `ZN18QLibAV_AudioPlayerD2Ev':| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|11|undefined reference to `__gxx_personality_sj0'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|11|undefined reference to `_Unwind_SjLj_Register'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|19|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|20|undefined reference to `_Unwind_SjLj_Unregister'| debug\qlibav_audioplayer.o||In function `ZN18QLibAV_AudioPlayerD1Ev':| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|11|undefined reference to `__gxx_personality_sj0'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|11|undefined reference to `_Unwind_SjLj_Register'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|19|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|20|undefined reference to `_Unwind_SjLj_Unregister'| debug\qlibav_audioplayer.o||In function `ZN18QLibAV_AudioPlayerD0Ev':| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|11|undefined reference to `__gxx_personality_sj0'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|11|undefined reference to `_Unwind_SjLj_Register'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|19|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|20|undefined reference to `_Unwind_SjLj_Unregister'| debug\qlibav_audioplayer.o||In function `ZN18QLibAV_AudioPlayer4PlayEPc':| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|23|undefined reference to `__gxx_personality_sj0'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|23|undefined reference to `_Unwind_SjLj_Register'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|34|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|41|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|44|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|49|undefined reference to `_Unwind_SjLj_Unregister'| debug\qlibav_audioplayer.o||In function `ZN18QLibAV_AudioPlayer8GetAudioEPcP10QByteArray':| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|70|undefined reference to `__gxx_personality_sj0'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|70|undefined reference to `_Unwind_SjLj_Register'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|109|undefined reference to `_Unwind_SjLj_Resume'| C:\Users\Michael\Documents\cpp_docs\Pragma\libav_5\qlibav_audioplayer.cpp|142|undefined reference to `_Unwind_SjLj_Unregister'| ||=== Build finished: 26 errors, 0 warnings ===|
Außerdem wurden Probleme mit ähnlichen Fehlermeldungen in Foren gelöst, indem das Verzeichnis der Qt SDK und das "include"-Verzeichnis von MinGW zu der Umgebungsvariable PATH hinzugefügt wurden. Das hat bei mir allerdings auch nicht geholfen.
Wenn ich schließlich das ganze als Projekt im Qt-Creator, der ebenfalls bei der Qt SDK dabei ist, erstelle, erhalte ich als Fehlermeldung, dass zahlreiche C99-Header nicht vorhanden wären. Wenn ich die fehlenden Header manuell einbinde, heißt es, dass zahlreiche Typ-Definitionen mehrfach vorhanden sind.
Damit weiß ich nun endgültig nicht mehr, was ich noch ausprobieren könnte.
Hoffentlich hat jemand von euch einen ziehlführenden Tipp!Ich bedanke mich schon mal im voraus für alle Antworten.
LG
Michael
-
Schlussendlich hab ich das Problem gelöst, indem ich auf qmake verzichtet habe.
Für den moc habe ich folgende Anweisung in die Pre-Build-Steps eingetragen:
C:\QtSDK\Desktop\Qt\4.7.3\mingw\bin\moc.exe -o qlibav_audioplayer.moc qlibav_audioplayer.h
Dazu am Ende der Datei "qlibav_audioplayer.cpp" die Zeile
#include "qlibav_audioplayer.moc"
hinzugefügt.
Außerdem musste man beachten, dass Qt für den Audio-Output auf seine Timer zurückgreifen muss - und die laufen nur, wenn es eine Event-Schleife gibt, die man in Qt mit
app.exec()
realisiert.