Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » DirectX » nicht aufgelöstes externes Symbol

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.12.2008, 00:49 Uhr
Hans_Wurst



Hallo,

ich möchte mit Hilfe der dinput.h einen Joystick ansteuern/auslesen. Aus welchem Grund auch immer, erkennt der Kompiler aber mein (im dinput.h) #define für IID_IDirectInput8 nicht.

Ich möchte die Werte in einer Konsolenanwendung auslesen und habe mittlerweile fast das Gefühl, dass das nur in einer Win32-GUI-Anwendung möglich ist. Ich konnte nun bereits mehrere Beispiele dafür erfolgreich testen (u.a. in den Samples vom SDK enthalten). Füge ich es jedoch in meinen Code ein, geht nichts mehr.

Ich hoffe ihr könnt mir weiterhelfen.

main

Code:
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}


joystick.h

Code:
#include <dinput.h>       // DirectInput

class directinput
{
public:
    LPDIRECTINPUT8 dinput;
    int init();
};


joystick.cpp

Code:
#include <dinput.h>       // DirectInput
#include "stdafx.h"
#include "joystick.h"

int directinput::init()
{
    HRESULT hr;

    hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
                                         IID_IDirectInput8, (VOID**)&dinput, NULL );

    return 0;
}


Fehlermeldung:
1>------ Erstellen gestartet: Projekt: joystickDirectXKonsole, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>joystick.cpp
1>cprogramme\microsoft directx 9.0 sdk (february 2005)\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
1>Verknüpfen...
1>joystick.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_DirectInput8Create@20" in Funktion ""public: int __thiscall directinput::init(void)" (?init@directinput@@QAEHXZ)".
1>joystick.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_IID_IDirectInput8W".
1>Cworkspaces\workspace-visualstudio\joystickDirectXKonsole\Debug\joystickDirectXKonsole.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
1>Das Buildprotokoll wurde unter "file://cworkspaces\workspace-visualstudio\joystickDirectXKonsole\joystickDirectXKonsole\Debug\BuildLog.htm" gespeichert.
1>joystickDirectXKonsole - 3 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

Dieser Post wurde am 19.12.2008 um 00:52 Uhr von Hans_Wurst editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.12.2008, 08:14 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Du musst auch die entsprechenden Libraries mit in dein Projekt linken
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.12.2008, 15:17 Uhr
0xdeadbeef
Gott
(Operator)


In diesem Fall dinput8.lib, wenn mich nicht alles täuscht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.12.2008, 16:31 Uhr
Hans_Wurst



Super. Ich danke euch. Jetzt funktioniert es. Falls jemand mal das gleiche Problem haben sollte, habe ich meine (jetzt richtigen) #includes mal hier angefügt:


Code:
#include <stdio.h>
#include <windows.h>
#include <dinput.h>       // DirectInput
#include "stdafx.h"
#include "joystick.h"
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.12.2008, 17:05 Uhr
0xdeadbeef
Gott
(Operator)


Link deine Bibliotheken nicht über Pragmas. In den Projekteinstellungen gibt es eine Gruppe Linker mit einem Eintrag Eingabe (oder Eingabedaten, etwas in der Art jedenfalls), wo du die Bibliotheken angeben kannst und solltest.

Warum nicht über pragmas linken? Zum einen kennt die kein anderer Compiler - das ist zwar, zugegeben, bei portablem Code interessanter, das reicht aber schon, um es zu einer schlechten Angewohnheit zu machen. Und was, wenn der msvc für deine Zwecke zu langsamen Code ausspuckt und du das ganze mal durch den Intel-Compiler jagen willst?

Zum zweiten gibst du so die Möglichkeit auf, in verschiedenen Projektkonfigurationen verschiedene Bibliotheken anzulinken. Bei Microsoft-Bibliotheken wirst du feststellen, dass es meistens eine name.lib und eine named.lib gibt, die letztere enthält Debug-Symbole, die du in der Debug-Konfiguration auf jeden Fall willst, um sinnvoll debuggen zu können.

Zum dritten, und jetzt wird's ein bisschen technisch, sind Linkereingaben keine Eigenschaft des Quellcodes. Punkt 2 verdeutlicht das schon recht anschaulich, aber der Punkt greift auch ganz allgemein. Stell dir zum Beispiel vor, dein Projekt wächst, und du hast irgendwann mehrere Unterprojekte - ein Spiel und einen Mapeditor zum Beispiel - die große Teile gemeinsamen Codes verwenden. In diesem Fall wäre die offensichtliche Lösung natürlich, den gemeinsamen Code in eine Bibliothek auszulagern und die gemeinsame Bibliothek an beide zu linken. Und jetzt musst du höllisch aufpassen, wo du deine Pragmas hinschreibst, damit nicht sowohl das Programm als auch die Bibliothek die Abhängigkeiten einbinden und den Linker durcheinanderbringen und/oder Speicher und Laufzeit verschwenden.

Oder du machst es wie jeder vernünftige Mensch seit den 70er Jahren und linkst deine Bibliotheken so, wie es immer gedacht war - im Buildsystem.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.12.2008, 23:48 Uhr
Hans_Wurst



@0xdeadbeef:
Ich habe vor die ganzen Joystickdaten in einer Klasse auszuwerten und diese Klasse dann von einem völlig anderem Code/Compiler zu verwenden. Ich möchte so mit Hilfe der Sprache Qt die Windows basierenden Funktionen verwenden. (Da Qt kein Joystick unterstützt)
Soll ich in diesem Fall deinen oben genannten Rat trotzdem umsetzen, oder wäre dies hierbei ein Sonderfall?



Mittlerweile hat sich ein weiteres Problem ergeben. Wenn ich die Funktion

Code:
DirectInput8Create(hInstance,                 // Instanz
                   0x0800,                    // Version
                   IID_IDirectInput8,         // Schnittstellenversion
                   (void**)(&g_pDirectInput), // Doppelzeiger auf Objekt
                   NULL)                      // Nicht wichtig

aufrufe, bekomme ich von "ihr" die Meldung, dass IDirectInput8-Objekt nicht erstellt werden konnte. Ich vermute es liegt daran, dass sie sich nicht mit meiner simplen Initialisierung von

Code:
HINSTANCE hInstance;
zufrieden ist.

Da ich jedoch die Klasse in einer Konsolenanwendung teste, bekomme ich auch nicht die Parameter (also in meinem Fall das fehlende hInstance) wie sie bei der GUI-Anwendung übergeben worden wären:

Code:
//int WINAPI WinMain(HINSTANCE hInstance,
//      HINSTANCE hPrevInstance,
//      char* pcCommandLine,
//      int iShowCommand)



Hat jemand eine Idee wie ich dieses Problem lösen/umgehen könnte?

Dieser Post wurde am 19.12.2008 um 23:59 Uhr von Hans_Wurst editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.12.2008, 17:13 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

Es gibt keine ausnahmen. dieses pragma ist eigentlich, wie deadbeef schon ausgelegt hat, eigentlich "absoluter querfug". Daher immer in die Projekteinstellungen eintragen.

Ansonsten eine uninitialiserte HINSTANCE taugt für Dx nix:


C++:
HINSTANCE hInstance = GetModuleHandle(NULL);



liefert dir die Instanz deiner Anwendung, (bzw DLL in der der Aufruf geschieht, falls du den Code in einer Bibliothek haben solltest!)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.12.2008, 23:28 Uhr
Hans_Wurst



Hallo,

ich habe die Pragmas "raus genommen" und die Funktion GetModuleHandle() verwendet. Jetzt läuft alles super.
Ich danke euch für eure Tipps
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ DirectX ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: