Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich habe die MFC-Anwendung habe ich daran arbeiten muß eine eingebettete Datenbank haben. Also ging ich für eine glatte Jagd, schnell „integrierbare“ Datenbank für sie und stolperte accross SQLite.

habe ich eine DB mit ihm, und ich erstellt ein statisches Bibliothek-Projekt mit Visual Studio 2008 das Bibliotheksprojekt in einem anderen Hauptprojekt verwendet werden.

In der Bibliothek Projekt, habe ich eine Klasse DBClass mit einem Verfahren AddFeedToDB(CFeed f). Das Bibliotheksprojekt verwendet die .lib Datei von Codeproject (cppsqlite3.lib).

Wenn die statische Bibliothek kompiliert, wird kein Fehler erkannt, aber wenn ich versuche, die Bibliothek Projektdatei in dem Hauptprojekt zu verwenden, erhalte ich diese Art von Fehlern:

error LNK2019: unresolved external symbol "public:void __thiscall
   CppSQLite3DB::close(void)" (?close@CppSQLite3DB@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z

Was bin ich fehlt?

War es hilfreich?

Lösung

Es passiert mir mehr als einmal, dass ich dachte Symbol XXX (d ?close@CppSQLite3DB@@QAEXXZ) betrug in der Import-lib, während das eigentliche Symbol war __impXXX (das heißt __imp?close@CppSQLite3DB@@QAEXXZ).

Der Grund für den Linker-Fehler ist dann in der Zusammenstellung Schritt gefunden werden: die Compiler das ?close@CppSQLite3DB@@QAEXXZ Symbol erzeugt importiert werden, wo es sollte __imp?close@CppSQLite3DB@@QAEXXZ erzeugen. Dies bedeutet oft, dass die Funktionsdeklaration selbst nicht __declspec( dllimport ) hat. Die von einigen Präprozessorsymbol kann nicht definiert ist, verursacht werden. Oder die __declspec dort überhaupt nicht zu sein ...

Andere Tipps

Ich weiß, es ist schon 2 Jahre her, seit dieser Frage ... aber ich laufe hier in der gleichen Situation. Hinzugefügt all Header-Dateien ... hinzugefügt, um die lib .. und halten diese Fehler aufweisen. So fügte ich manuell den lib auf die Konfigurationseigenschaften -> Linker -> Eingang -> Aditional Abhängigkeiten und alles funktioniert für mich.

Sie wissen nicht, wenn es der Fall ist, aber der imp-Präfix kann bedeuten, dass Sie eine x64-Bibliothek in einem Win32-Projekt kompilieren.

Sie müssen entweder die Codeproject SQLite lib auf die ausführbare Datei verknüpfen, oder die Quellen-Dateien in Ihrem Projekt direkt aufzunehmen. (Welcher hast du getan?)

Ich würde die folgenden Schritte aus:

  1. darüber nachdenken, was Bibliothek oder OBJ Sie das Symbol erwarten Datei exportiert werden.

  2. prüfen, ob es tatsächlich tut Export, die sehr Symbol (überprüfen zeichenweise). Manchmal ist es die Aufrufkonvention unterscheidet.

  3. überprüfen, ob die Bibliothek Sie das Symbol enthalten erwarten an den Linker bekannt ist - erste Prüfung für die ‚zusätzliche Bibliotheken‘, dann überprüfen, ob die Bibliothek tatsächlich gefunden wird (Ich tue dies meist durch filemon.exe mit aus Sysinternals, und suchen Sie nach link.exe die lib-Datei zu öffnen.)

Nach einer Weile denken, können Sie feststellen, dass Ihre Bibliothek Projekt nicht die für die Funktion gesucht exportieren. Diese Funktion ist in der Datenbank lib. Sie sollten diese lib zu Ihrem Hauptprojekt hinzuzufügen. Es hat keinen Sinn, es zu statischen lib Projekt hinzugefügt wird.

Der Compiler und Linker nicht verknüpfen einer Bibliothek in eine andere (es sei denn man eine DLL ist). Sie müssen beiden Bibliotheken angeben (cppsqlite3.lib und Ihre eigene statische Bibliothek) in Ihrem Hauptprojekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top