Bibliotheken und unaufgelöste Symbole
-
Hi,
vor kurzem lud ich mir das DirectX-SDK herunter, um mal, wenn auch ohne große Hoffnung, zu schauen was man damit anstellen kann. In der Dokumentation sind auch Tutorials dabei, die grob simple Dinge, wie das Erstellen von einfarbigen Fenstern usw. erklären. Nachdem ich eins dieser Tutorials bearbeitet hatte und auf mein schönes blaues Fenster wartete, bekam ich die Meldungen:
fatal error LNK1120: 1 nicht aufgelöste externe Verweise. C:\Users\****\Documents\Visual Studio 2008\Projects\DirectX-Tut\Debug\DirectX-Tut.exe 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D3D10CreateDeviceAndSwapChain@32" in Funktion ""long __cdecl InitDevice(void)" (?InitDevice@@YAJXZ)". Main.objEs ist so, dass die Tutorials im SDK schon implementiert sind, d.h. ich konnte in den SDK-Ordner gehen und die fertige Datei kompilieren. Bei meiner mit Hilfe des Tutorials "Selbstgeschriebenen", die der Beispieldatei logischerweise ziemlich glich, klappte das nicht.
Noch mal kurz:
Meine Datei -> externes-Symbol-Fehler
Die Beispieldatei -> kompilierte ohne Fehler
Selbst wenn ich den Beispielquelltext testweise zu mir einfach rüberkopiert hab um zu schauen obs nicht doch an meinem Quelltext liegt kam der Fehler.Jetzt kommen solche Fehler ja soweit ich weiß, wenn Bibliotheken nicht eingebunden sind. Die Pfade zu den Ordnern mit den Bibliotheken hab ich aber angegeben (Bei Optionen->Projekte und Projektmappen->VC++-Verzeichnisse. Als ich die beiden Projekte dann verglichen hab, um zu sehen was falsch sein könnte, konnte man sehen, dass beim Beispielprojekt noch unter Projekt->Eigenschaften unter Linker->Eingabe bei "zusätzliche Abhängigkeiten" "d3d10.lib" und "d3dx10d.lib" eingetragen waren.
Ich hatte das nicht eingetragen und als ichs bei mir nachgetragen hab, hatte sich der Fehler erledigt.Sorry für den Roman, ich wollte nur den ganzen Sachverhalt beschreiben. Das Ganze klingt ja im Nachhinein auch ganz logisch, aber:
Muss ich das jetzt bei jedem Projekt eintragen? Ich meine, ich hab den Bibliothekspfad in dem sich "d3d10.lib" und "d3dx10d.lib" befinden ja schließlich schon unter den Optionen bei den Bibliotheksverzeichnissen eingetragen. Ich ging davon aus, dass der die eingetragenen Ordner durchgeht und sich die nötigen .lib-Dateien raussucht? So funktioniert das bei den Includedateien und den Headern ja auch.So, danke fürs Lesen und für eventuelle Antworten.
-
Du musst schon angeben, welche libs eingebunden werden sollen. Das ist bei den Headern nicht anders (da gibst du das ja mit #include an). Du könntest dir ja einen Standard-Header bauen und dort die benötigten libs per pragma comment Anweisung einbinden (http://support.microsoft.com/kb/153901).
-
Alles klar, danke für die Antwort. Jetzt wo du es sagst, ich hatte ganz vergessen, dass ich die Header ja auch explizit angebe. Ich hatte da wohl einen kleinen Aussetzer. Jetzt erscheint das alles ein bisschen konsequenter mit dem Einbinden.

Was ist denn üblicher, die pragma-comment-Anweisung oder das Einbinden per IDE-Optionen (Obwohl das vielleicht intern eh keinen Unterschied macht)? Ich kann mir vorstellen, dass das pragma klarer ist, wenn man den Quelltext weitergibt.
-
DirectX LIbs wurden nicht angegeben:
#pragma comment(lib,"d3d10.lib") #pragma comment(lib,"d3dx10.lib")
-
Blubb schrieb:
Was ist denn üblicher, die pragma-comment-Anweisung oder das Einbinden per IDE-Optionen (Obwohl das vielleicht intern eh keinen Unterschied macht)? Ich kann mir vorstellen, dass das pragma klarer ist, wenn man den Quelltext weitergibt.
Was üblicher ist? Keine Ahnung. Bei uns ist die Variante Project-Settings die übliche, warum auch immer. Ich würde aber eigentlich eher zur pragma comment Anweisung tendieren, da direkt im Source sichtbar (wie du schon sagst). Außerdem könntest du dir in deinem Fall z.B. einen Standard-Header für DirectX-Anwendungen schreiben, in dem (vielleicht neben weiteren, eigenen Dingen) die nötigen libs eingebunden werden. Den bindest du dann einfach in jede Anwendung dieses Typs ein.
Verloren geht jedenfalls nix bei der Weitergabe, solange du das ganze Projekt weitergibst.
-
Ich halte es für sinnreicher pragma statements zu verwenden. Besonders wenn man code wiederverwendet oder eigene Libs aufbaut, dann kann durch ein entsprechend gesettes pragma sofort die entsprechende Lib gezogen werden, oghne das der Entwickler nur eine Projekteinstellung anfasst.
Man steuert einfach mehr und sichtbar durch den Code!