Domanda

Ho questa applicazione MFC su cui sto lavorando che deve avere un database incorporato.Così sono andato a cercare un database "incorporabile" veloce e veloce e mi sono imbattuto in SQLite.

Con esso ho creato un DB e ho creato un progetto di libreria statica con Visual Studio 2008.il progetto della libreria verrà utilizzato in un altro progetto principale.

Nel progetto biblioteca, ho creato una classe DBClass con un metodo AddFeedToDB(CFeed f).Il progetto della biblioteca utilizza il file .lib file da codeproject (cppsqlite3.lib).

Durante la compilazione della libreria statica, non viene rilevato alcun errore, ma quando provo a utilizzare il file di progetto della libreria nel progetto principale, ottengo questo tipo di errori:

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

Cosa mi manca?

È stato utile?

Soluzione

Mi è capitato più di una volta di pensare al simbolo XXX (cioè. ?close@CppSQLite3DB@@QAEXXZ) era nella libreria di importazione, mentre il simbolo effettivo era __impXXX (cioè. __imp?close@CppSQLite3DB@@QAEXXZ).

Il motivo dell'errore del linker è quindi da ricercare nella fase di compilazione:il compilatore genererà il file ?close@CppSQLite3DB@@QAEXXZ simbolo da importare, dove it Dovrebbe creare __imp?close@CppSQLite3DB@@QAEXXZ.Ciò spesso significa che la dichiarazione della funzione stessa non aveva __declspec( dllimport ).Ciò potrebbe essere causato dalla mancata definizione di alcuni simboli del preprocessore.O il __declspec non esserci affatto...

Altri suggerimenti

So che è già 2 anni da quando questa domanda ... ma ho eseguito nella stessa situazione qui. Aggiunti tutti i file di intestazione ... aggiunto le directory lib .. e continuare ad avere questo errore. Così ho aggiunto manualmente il lib alla Configurazione Proprietà -> Linker -> -> ingresso Aditional Dipendenze e tutto funziona per me.

Non so se è il vostro caso, ma il prefisso imp può significare che si sta compilando una biblioteca x64 in un progetto Win32.

Si sia necessario collegare lo SQLite lib CodeProject al vostro eseguibile, o per includere i file sorgenti nel progetto direttamente. (Quale hai fatto?)

Vorrei attenersi alla seguente procedura:

  1. pensare a quello biblioteca o file obj si aspetta il simbolo da esportare da.

  2. controllare se effettivamente ha di esportazione che simbolo (controllare il carattere-saggio). A volte, è la convenzione di chiamata è diversa.

  3. controllare se la libreria si aspetta di contenere il simbolo è conosciuto per il linker - primo controllo per le 'librerie aggiuntive', quindi verificare se la libreria è effettivamente trovato (Io per lo più farlo utilizzando FileMon.exe da Sysinternals, e cercare LINK.EXE per aprire il file lib.)

Dopo averci pensato un po ', si potrebbe scoprire che il vostro progetto biblioteca sarà non esportare la cercavano per la funzione. Tale funzione è nella lib database. Si dovrebbe aggiungere che lib al progetto principale. E 'inutile aggiungerlo al progetto lib statica.

Il compilatore e il linker non collegherà una libreria in un altro (se non si è una DLL). È necessario specificare entrambe le librerie (cppsqlite3.lib e la vostra libreria statica proprio) nel progetto principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top