2009-05-11 35 views
13

Tengo esta aplicación MFC en la que estoy trabajando que necesita tener una base de datos integrada. Así que fui a buscar una base de datos "incrustable" rápida y astuta para ello y tropecé con SQLite.¿Cómo puedo resolver el "error LNK2019: símbolo externo no resuelto"?

Creé un DB con él y creé un proyecto de biblioteca estática con Visual Studio 2008. El proyecto de biblioteca se usará en otro proyecto principal.

En el proyecto de biblioteca, creé una clase DBClass con un método AddFeedToDB(CFeed f). El proyecto de biblioteca utiliza el archivo .lib del proyecto de código (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)" ([email protected]@@QAEXXZ 
    referenced in function "public: int __thiscall 
    CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (? 
    [email protected]@@[email protected]@[email protected] 

¿Qué me falta?

Respuesta

9

Se me ha pasado más de una vez que pensé símbolo XXX (es decir [email protected]@@QAEXXZ) fue en el lib de importación, mientras que el símbolo real fue __impXXX (es decir [email protected]@@QAEXXZ).

El motivo del error enlazador es entonces que se encuentran en el paso de compilación: el compilador generará el símbolo [email protected]@@QAEXXZ a ser importado, donde debe generar[email protected]@@QAEXXZ. Esto a menudo significa que la declaración de la función en sí no tenía __declspec(dllimport). Que puede ser causado por algún símbolo del preprocesador no definido. O el __declspec no está allí en absoluto ...

+0

¿Responde esto a la pregunta? – ST3

+0

@ ST3: al parecer, resolvió este caso particular. No es una receta general para resolver errores de enlazador, si eso es lo que quieres decir. – xtofl

+0

Sí, agregar esta línea también resolvió mi problema (similar). Lo que sucede en realidad es que algún proyecto necesita un símbolo definido en otro archivo DLL que no se exporta (generalmente MSVS) –

1

O bien necesita vincular el proyecto de código SQLite lib a su ejecutable, o incluir directamente los archivos de fuentes en su proyecto. (¿Cuál hizo usted?)

+2

en el proyecto de biblioteca, fui a project-> properties-> Configuration Properties-> Librarian-> General-> Additional Dependencies y agregué ".. \ SQLiteCommon \ sqlite3.lib" a él. – Attilah

+0

¿Lo vinculó estáticamente (a medida que lo compiló)? – MickaelFM

+0

sí, lo conecté estáticamente, creo. pero lo que es extraño es que, como en otros tipos de proyectos, no veo una pestaña Enlazador en Propiedades del proyecto-> Propiedades de configuración, pero veo Bibliotecario en su lugar. – Attilah

1

me habría siga estos pasos:

  1. pensar en lo que la biblioteca o archivo .obj que espera el símbolo que exporta.

  2. comprobar si en realidad hace exportar ese mismo símbolo (marque el carácter). A veces, es la convención de llamadas diferente.

  3. compruebe si la biblioteca que espera contener el símbolo es conocida por el vinculador - primero compruebe las 'bibliotecas adicionales', luego verifique si realmente se encuentra la biblioteca (lo hago principalmente usando filemon.exe desde sysinternals y buscar 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 está en la base de datos lib. Deberías agregar esa lib a tu proyecto principal. No sirve de nada agregarlo a tu proyecto lib estático.

+0

la lib (sqlite.lib) exporta los símbolos. agregué la lib a mi proyecto principal, todavía no funciona. todavía tengo los mismos errores. – Attilah

1

El compilador y el enlazador no vincularán una biblioteca a otra (a menos que una sea una DLL). Necesita especificar ambas bibliotecas (cppsqlite3.lib y su propia biblioteca estática) en su proyecto principal.

4

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

15

Sé que ya han pasado 2 años desde esta pregunta ... pero me encuentro en la misma situación aquí. Se agregaron todos los archivos de cabecera ... se agregaron los directorios lib ... y siguen teniendo este error. Así que agregué manualmente la lib a Propiedades de Configuración -> Enlazador -> Entrada -> Dependencias Adicionales y todo me funciona.

+0

Genial, gracias por la buena respuesta, el error del enlazador se debe a la dependencia –

Cuestiones relacionadas