windows library in Qt einbinden

Alles rund um die Programmierung mit Qt
Antworten
Hans_Wurst
Beiträge: 36
Registriert: 8. Mai 2008 16:44

windows library in Qt einbinden

Beitrag von Hans_Wurst »

Hallo,

ich möchte unter anderem Funktionen erstellen, die von einem Gamer-Joystick ausgelöst werden. Da Qt die Joystick-Funktion leider nicht unterstützt, muss ich in kauf nehmen, dass dieser Teil des Programms nur in Windows läuft und würde dafür gerne die Windows-Bibliothek einbinden. Kann mir jemand sagen wie ich diese einbinden kann, so dass das Hauptprogramm trotzdem Qt-basierend ist?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was für ein Problem gibt es genau? Es gibt absolut kein Problem WinAPI und Qt zu mischen (zumal Qt intern ja auch die WinAPI benutzt)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Hans_Wurst
Beiträge: 36
Registriert: 8. Mai 2008 16:44

Beitrag von Hans_Wurst »

Wenn ich

Code: Alles auswählen

#include <windows.h>
einfüge, bekomme ich die Warnung Unresolved inclusion
Was soweit aber noch kompilierbar ist.

Füge ich dann aber meine erste Joystick-Funktion ein, bekomme ich schon die Fehlermeldung undefined reference to `joyGetPosEx@8'

Code: Alles auswählen

BOOL GetJoyData(UINT uJoyID, LPJOYINFOEX lpji)
{
 memset(lpji, 0, sizeof(JOYINFOEX)); // For good measure.
 lpji->dwSize = sizeof(JOYINFOEX);
 // Note: With game pad, it takes no more time to return all
 // information from the joystick than it does to get only
 // the button states or axis.
 //
 lpji->dwFlags = JOY_RETURNALL;
 // JoyGetPosEx will fill in the joyinfoex struct with all the
 // joystick information.
 //
 switch(joyGetPosEx(uJoyID, lpji))
 {
  case JOYERR_NOERROR: // No problem.
   break;
  case MMSYSERR_NODRIVER:
//   MessageBox( NULL,
//      "The game pad driver is not present.",
//      "JOYSTICK ERROR",MB_OK);
   return FALSE;
  case MMSYSERR_INVALPARAM:
//   MessageBox( NULL,
//      "An invalid parameter was passed.",
//      "JOYSTICK ERROR",MB_OK);
   return FALSE;
  case MMSYSERR_BADDEVICEID:
//   MessageBox( NULL,
//      "The specified JOYSTICKID identifier is invalid.",
//      "JOYSTICK ERROR",MB_OK);
   return FALSE;
  case JOYERR_UNPLUGGED:
//   MessageBox( NULL,
//      "Your game pad is unplugged.",
//      "JOYSTICK ERROR",MB_OK);
   return FALSE;
  default:
//   MessageBox( NULL,
//      "Unknown game pad error.",
//      "JOYSTICK ERROR",MB_OK);
   return FALSE;
 }   // End of switch.
 return TRUE;
} // GetJoyData()
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn ich eine Funktion einer externen Library einbinde muss ich wohl auch gegen die Library linken.
Eine Warnung "Unresolved inclusion" habe ich noch nie gesehen - scheint aber laut google irgendwas mit Eclipse zu tun zu haben und nichts mit dem Compiler geschweige denn Qt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

Schau in die MSDN:
joyGetPosEx
http://msdn.microsoft.com/en-us/library ... S.85).aspx

Und das kommt aus der Library: Use Winmm.lib

Und gegen die mußt du halt linken:

Also muß in dein .pro-File
LIBS+=winmm

Gruß, Gérôme
Hans_Wurst
Beiträge: 36
Registriert: 8. Mai 2008 16:44

Beitrag von Hans_Wurst »

Ich habe jetzt versucht (in Eclipse) über
Project -> Properties -> C/C++ Include Paths and Symbols -> Add External Include Path
die Libray WinMM.lib einzubinden (liegt bei mir in ...Microsoft Visual Studio 8\VC\PlatformSDK\Lib). Erhalte aber immer die selben Fehlermeldungen.

Auch wenn wenn ich die *.lib direkt in den Projekt-Ordner kopiere, bekomme ich die Fehlermeldung.

Nur wenn ich das LIBS+=winmm wieder aus dem .pro-File rauslösche, kann ich den Code (zumindest ohne Joystick-Funktion) kompilieren.

Ich bin echt ratlos wie ich das richtig machen soll.

Meine Ausgabemeldungen sind:

Code: Alles auswählen

mingw32-make debug 
mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/workspaces/workspace-Qt/joystick'
c:\Programme\Trolltech\Qt\4.4.3\bin\uic.exe joystick.ui -o ui_joystick.h
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include" -I"c:\Programme\Trolltech\Qt\4.4.3\include\ActiveQt" -I"debug" -I"." -I"..\..\..\Programme\Trolltech\Qt\4.4.3\mkspecs\default" -o debug\main.o main.cpp
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include" -I"c:\Programme\Trolltech\Qt\4.4.3\include\ActiveQt" -I"debug" -I"." -I"..\..\..\Programme\Trolltech\Qt\4.4.3\mkspecs\default" -o debug\joystick.o joystick.cpp
C:\Programme\Trolltech\Qt\4.4.3\bin\moc.exe -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include" -I"c:\Programme\Trolltech\Qt\4.4.3\include\ActiveQt" -I"debug" -I"." -I"..\..\..\Programme\Trolltech\Qt\4.4.3\mkspecs\default" -D__GNUC__ -DWIN32 joystick.h -o debug\moc_joystick.cpp
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtCore" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include\QtGui" -I"..\..\..\Programme\Trolltech\Qt\4.4.3\include" -I"c:\Programme\Trolltech\Qt\4.4.3\include\ActiveQt" -I"debug" -I"." -I"..\..\..\Programme\Trolltech\Qt\4.4.3\mkspecs\default" -o debug\moc_joystick.o debug\moc_joystick.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\joystick.exe debug/main.o debug/joystick.o debug/moc_joystick.o  -L"c:\Programme\Trolltech\Qt\4.4.3\lib" -lmingw32 -lqtmaind winmm -lQtGuid4 -lQtCored4
g++: winmm: No such file or directory
mingw32-make[1]: *** [debug\joystick.exe] Error 1
mingw32-make[1]: Leaving directory `C:/workspaces/workspace-Qt/joystick'
mingw32-make: *** [debug] Error 2
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Beitrag von gerome69 »

Dir fehlen echt einige Grundlagen:
- Du kannste keine VisualStudio-libs mit mingw kombinieren.
- Schau mal in den Output: "-lmingw32 -lqtmaind winmm" => was schließen wir daraus? LIBS+=-lwinmm

G.
Hans_Wurst
Beiträge: 36
Registriert: 8. Mai 2008 16:44

Beitrag von Hans_Wurst »

@gerome69:
Leider hast du Recht. Ich würde das auch gerne ändern. Wenn jemand vielleicht eine gute Seite kennt, auf der man darüber (anfängergerecht) nachlesen kann, wäre ich sehr dankbar.

Warm aus winmm ein lwinmm wird kann ich mir nicht erklären und bei den VisualStudio-libs dachte ich, die würden genauso eingebunden werden, wie irgend welche anderen Bibliotheken (Und der Kompiler verwendet dann die, auf die er gerade als erstes zugreift).

Es funktioniert jetzt aber alles, wofür ich euch sehr dankbar bin.
Antworten