Question

    

Cette question a déjà une réponse ici:

         

J'ai cette application MFC je travaille qui a besoin d'avoir une base de données intégrée. Je suis donc allé à la chasse pour une marée noire, rapide base de données « intégrable » pour elle et sommes tombés accross SQLite.

J'ai créé un DB avec elle, et je créé un projet de bibliothèque statique avec Visual Studio 2008. Le projet de bibliothèque sera utilisé dans un autre projet principal.

Dans le projet de bibliothèque, j'ai créé une classe avec une méthode DBClass AddFeedToDB(CFeed f). Le projet de bibliothèque utilise le fichier de CodeProject .lib (cppsqlite3.lib).

Lors de la compilation de la bibliothèque statique, aucune erreur est détectée, mais lorsque je tente d'utiliser le fichier de projet de bibliothèque dans le projet principal, je reçois ce type d'erreurs:

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

Qu'est-ce que je suis absent?

Était-ce utile?

La solution

Il me est arrivé plus d'une fois que je pensais symbole XXX (c.-à-?close@CppSQLite3DB@@QAEXXZ) n'a dans le répertoire lib d'importation, alors que le symbole réel était __impXXX (c.-à-__imp?close@CppSQLite3DB@@QAEXXZ) .

La raison de l'erreur de liaison est alors à trouver dans l'étape de compilation: le compilateur génère le symbole à __declspec( dllimport ) importé, où devrait générer __declspec. Cela signifie souvent que la déclaration de fonction elle-même n'a pas <=>. Ce qui peut être causée par un symbole de préprocesseur ne pas être défini. Ou le <=> ne pas être là du tout ...

Autres conseils

Je sais qu'il est déjà 2 ans que cette question ... mais je cours dans la même situation ici. Ajout tous les fichiers d'en-tête ... ajouté les répertoires lib .. et continue à avoir cette erreur. Donc, j'ai ajouté manuellement le répertoire lib des propriétés de configuration -> Linker -> Entrée -> suplémentaires dépendances et tout fonctionne pour moi.

Je ne sais pas si c'est votre cas, mais le préfixe diablotin peut signifier que vous compilez une bibliothèque x64 dans un projet Win32.

Soit vous devez lier le CodeProject SQLite lib à votre exécutable, ou d'inclure les fichiers sources dans votre projet directement. (Laquelle avez-vous fait?)

Je procédez comme suit:

  1. penser à ce que la bibliothèque ou OBJ vous attendez fichier le symbole à exporter par.

  2. vérifier si elle a effectivement fait export que très symbole (caractère de contrôle-sage). Parfois, il est la convention d'appel diffère.

  3. vérifier si la bibliothèque vous attendent à contenir le symbole est connu pour l'éditeur de liens - vérifiez d'abord pour les « bibliothèques supplémentaires », puis vérifier si la bibliothèque est effectivement trouvé (je fais surtout cela en utilisant Filemon.exe de Sysinternals et recherchez link.exe pour ouvrir le fichier lib.)

Après avoir réfléchi un certain temps, vous pouvez constater que votre projet de bibliothèque pas exporter la recherché pour la fonction. Cette fonction est dans la base de données lib. Vous devez ajouter que lib à votre projet principal. Il ne sert à rien d'ajouter à votre projet lib statique.

Le compilateur et l'éditeur de liens ne lient une bibliothèque dans une autre (sauf si on est une DLL). Vous devez spécifier les deux bibliothèques (cppsqlite3.lib et votre propre bibliothèque statique) dans votre projet principal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top