Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Tengo esta aplicación MFC estoy trabajando en que tiene que tener una base de datos integrada. Así que fui a la caza de una mancha, rápido base de datos "embebido" para él y encontré al otro lado de SQLite.

He creado una base de datos con él, y he creado un proyecto de biblioteca estática con Visual Studio 2008. El proyecto de la biblioteca será utilizada en otro proyecto principal.

En el proyecto de la biblioteca, he creado una clase DBClass con un método AddFeedToDB(CFeed f). El proyecto de la biblioteca utiliza el archivo desde .lib CodeProject (cppsqlite3.lib).

Al compilar la biblioteca estática, no se detecta ningún error, pero cuando trato de utilizar el archivo de proyecto de biblioteca en el proyecto principal, recibo este tipo de errores:

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é me falta?

¿Fue útil?

Solución

Me ha ocurrido más de una vez que pensé símbolo XXX (es decir ?close@CppSQLite3DB@@QAEXXZ) era en el lib de importación, mientras que el símbolo real fue __impXXX (es decir __imp?close@CppSQLite3DB@@QAEXXZ) .

El motivo del error enlazador es entonces que se encuentran en el paso de compilación: el compilador generará el símbolo __declspec( dllimport ) a ser importado, donde debe generar __declspec. A menudo, esto significa que la propia declaración de la función no tenía <=>. Que puede ser causada por algún símbolo de preprocesador no se está definiendo. O el <=> no estar allí en absoluto ...

Otros consejos

Sé que ya es de 2 años desde que esta pregunta ... pero corro en la misma situación aquí. Agregado todos los archivos de cabecera ... añadido los directorios lib .. y seguir teniendo este error. Por lo que añade manualmente el lib a las propiedades de configuración -> Enlazador -> Entrada -> Dependencias Adicionales y todo funciona para mí.

No sabe si es su caso, pero el prefijo imp puede significar que está compilando una biblioteca de 64 bits en un proyecto Win32.

sea necesario vincular el SQLite lib CodeProject a su ejecutable, o para incluir los archivos de fuentes en su proyecto directamente. (¿Cuál hizo usted?)

Me sigue estos pasos:

  1. pensar en qué biblioteca o archivo .obj que espera el símbolo que exporta.

  2. comprobar si realmente hace de exportación que símbolo mismo (comprobar el carácter a gota). A veces, es la convención de llamada es diferente.

  3. comprobar si la biblioteca que esperar para contener el símbolo se sabe que el enlazador - primer cheque para las bibliotecas adicionales '', a continuación, comprobar si la biblioteca se encuentra realmente (que en su mayoría hacen mediante el uso de filemon.exe sysinternals, y buscan link.exe para abrir el archivo lib.)

Después de pensar un rato, es posible que su proyecto de biblioteca no exportar la buscada para la función. Esa función se encuentra en la base de datos lib. Usted debe agregar que lib a su proyecto principal. Es inútil añadir a su proyecto lib estática.

El compilador y el enlazador no se enlazan uno biblioteca en otro (a menos que uno es un DLL). Es necesario especificar las dos bibliotecas (cppsqlite3.lib y su propia biblioteca estática) en su proyecto principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top