Probleme beim Linken mit Direct3DCreate9



  • Hallo allerseits!

    Ich will eine Windows MFC Anwendung mit einem DirectX Fenster schreiben.

    Dazu startete ich ein Standard MFC Projekt und baute schrittweise einzelne Funktionen aus den DirectX9 Tutorial "Create a Device" ein.

    Dabei habe ich jetzt ein Problem mit der InitD3D Funktion:
    selbst wenn ich sie auf den Teil

    HRESULT InitD3D( HWND hWnd )
    {
        // Create the D3D object, which is needed to create the D3DDevice.
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
            return E_FAIL;
        // Hier kommt normalerweise noch mehr, ich habe es weggelassen um den Fehler einzukreisen.
        // Aber selbst bei der vollständigen Funktion (siehe Link oben) tritt das Problem auf.
        return S_OK;
    }
    

    reduziere, tritt beim builden folgender Error auf:

    Generating Code...
    Compiling resources...
    Compiling manifest to resources...
    Linking...
    LINK : D:\Eigene Dateien\Visual Studio 2005\Projects\mfc-test\Debug\mfc-test.exe not found or not built by the last incremental link; performing full link
    mfc-testDlg.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "long __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAJPAUHWND__@@@Z)
    D:\Eigene Dateien\Visual Studio 2005\Projects\mfc-test\Debug\mfc-test.exe : fatal error LNK1120: 1 unresolved externals

    Die folgenden Teilschritte funktionieren (im Sinne von keine Errors beim Builden) zuvor:

    Insbesondere funktioniert also der #include <d3d9.h> Befehl, die DirectX Include Verzeichnisse und Libs habe ich im Visual Studio eingebaut. (Und bei den Tutorials funktioniert auch alles.)

    Die InitD3D Funktion wird noch nicht aufgerufen, ich habe sie nur eingebaut.

    Hat jemand also eine Idee, woran das liegen könnte und wie ich es vermeiden kann?

    Danke und Gruß!



  • d3d9.lib

    #pragma comment(lib, "d3d9.lib")
    #pragma comment(lib, "d3dx9.lib")
    #pragma comment(lib, "dxguid.lib")
    


  • Vertexwahn schrieb:

    d3d9.lib

    #pragma comment(lib, "d3d9.lib")
    #pragma comment(lib, "d3dx9.lib")
    #pragma comment(lib, "dxguid.lib")
    

    Danke schön, funktioniert! 🙂

    Wenn noch eine Zusatzfrage erlaubt ist:
    Woher hätte ich das wissen können?
    Die Quelle dieser Weißheit beinhaltet womöglich noch anderes interessantes aber mir noch nicht bekanntes Wissen. 😉
    (und damit erspare ich Euch ggf. weitere dumme Fragen...)

    Und warum war das beim Tutorial nicht erforderlich:

    #include <d3d9.h>
    #pragma warning( disable : 4996 ) // disable deprecated warning 
    #pragma warning( default : 4996 )
    

    Danke und Gruß!



  • Woher hätte ich das wissen können?

    Aus einem C++ Buch

    Das steht sogar auf meiner Homepage z. B.:
    http://turing.fh-landshut.de/~jamann/Audioprogrammierung unter Windows mit C++ fuer Computerspiele.pdf
    siehe Seite 9 bis 11

    oder hier:
    http://turing.fh-landshut.de/~jamann/dxeinstellungen.htm

    Im DXSDK steht immer unten auf jeder Seite dabei:

    Header: Declared in D3d9.h.
    Import Library: Use D3d9.lib.

    jetzt rate mal wozu 😉



  • #pragma warning( disable : 4996 ) // disable deprecated warning
    #pragma warning( default : 4996 )
    

    alles was mit #pragma anfängt ist Compiler/Linkerspezifisch! mit pragma warning disable sagst du den Compiler, das er beim Übersetzen keine Warning ausschmeisen soll wenn der49 Warnungsfall 4996 auftritt - such einfach mal in der Dokumentation was die Warning 4996 bedeutet - wahrscheinlich ist es die Warnung die sagt das printf, scanf, usw. deprecated sind bzw. unsicher (da sie nicht gegen Bufferoverflows prüfen) - dagegen gibt es z.B. beim MS Compiler sichere Varianten die man verwenden kann - damit ist aber der Code nicht mehr so portabel....



  • Danke für die erneute Antwort!

    Vertexwahn schrieb:

    Woher hätte ich das wissen können?

    Aus einem C++ Buch

    Das steht sogar auf meiner Homepage z. B.:
    http://turing.fh-landshut.de/~jamann/Audioprogrammierung unter Windows mit C++ fuer Computerspiele.pdf
    siehe Seite 9 bis 11

    oder hier:
    http://turing.fh-landshut.de/~jamann/dxeinstellungen.htm

    Ähm, egal in welcher dieser Quellen ich nach dem Wort pragma suche, es gibt keine Fundstellen.
    (Und das hinzufügen der Pfade, was im ersten Link beschrieben ist, hatte ich ja auch selbst hinbekommen...:))

    Vertexwahn schrieb:

    Im DXSDK steht immer unten auf jeder Seite dabei:

    Header: Declared in D3d9.h.
    Import Library: Use D3d9.lib.

    Bei mir auch nicht. (Siehe die im ersten Beitrag angegebene Links, ziemlich genau so sieht bei mir auch die offline Dokumentation aus...)
    In den Beispielen wurde zwar immer

    #include <d3d9.h>
    

    verwendet und das hatte ich ja auch getan (siehe ganz oben...), allerdings reichte das ja nicht aus, es mußten die #pragma comment ... Zeilen hinzugefügt werden.

    Und das meinte ich auch , als ich den Header aus den Beispielen hier postete:

    #include <d3d9.h>
    #pragma warning( disable : 4996 ) // disable deprecated warning
    #pragma warning( default : 4996 )
    

    Was ich damit meinte war:
    Warum reicht das in den Beispielprogrammen/Tutorials aus, aber wenn ich selbst ein neues Projekt erstelle, dann muss ich noch die #pragma comment ... Zeilen hinzufügen, weshalb das?
    Ich hatte das wohl nicht klar genug ausgedrückt.

    Bitte nicht falsch verstehen, ich will nicht rechthaberisch sein, sondern nur verstehen was ich da mache. 🙂

    Danke und Gruß!



  • Ähm, egal in welcher dieser Quellen ich nach dem Wort pragma suche, es gibt keine Fundstellen.
    

    such mal bei google nach pragma - was ist pragma? pragma leitet meistens etwas Compilerspezifisches ein - z. B. kann man damit Das BytePadding in Strukturen beeinflussen:

    struct Datei
    {
    int a;    // Byte-Adresse 0
    char b;   // Byte-Adresse 4  -> 3 Bytes verschwendet, Speicherplatzverschwendung
              // oder schneller Zugriff?
    int c;    // Byte-Adresse 8
    };
    

    das du pragma nicht gefunden hast liegt daran, das man Libarys auch anders einbinden kann - das ist aber bei jedem Linker anders - z. B.:

    Visual Studio 6.0
    1. Klicken Sie im Arbeitsbereich mit der rechten Maustaste auf Projekt Dateien
    (Projekt steht hier für den Projektnamen z. B. PlaySoundBeispiel) und folgendes
    Pop-Up-Menü erscheint:
    2. Klicken Sie auf "Einstellungen...", danach offnet sich ein Fenster mit dem Titel
    "Projekteinstellungen"
    3. Klicken Sie auf die Karteikarte "Linker" und fügen Sie im Textfeld Objekt-
    /Bibliothek-Module die Datei d3d9.lib ein.

    Header: Declared in D3d9.h.
    Import Library: Use D3d9.lib.

    Bei mir auch nicht.

    Such mal im DXSDK das Interface IDirect3D9
    und guck mal was da ganz unten auf der Seite steht 😉

    Warum reicht das in den Beispielprogrammen/Tutorials aus, aber wenn ich selbst ein neues Projekt erstelle, dann muss ich noch die #pragma comment ... Zeilen hinzufügen, weshalb das?

    weil es mehrere Möglichkeiten gibt dem Linker zu sagen in welchen Libarys er nach Startadressen und Maschinencode beim Übersetzen suchen soll



  • Ah ja, danke, jetzt habe ich das verstanden! 🙂


Anmelden zum Antworten