2010-05-17 12 views
6

Tengo un proyecto nativo C++ VS2008, que deseo compilar como una DLL.C++ Project compila como lib estática, falla (error del enlazador) como lib dinámico. ¿por qué?

Solo hace referencia a una biblioteca externa (log4cplus.lib) y utiliza sus funciones. (también usa los archivos .h de log4cplus, naturalmente).

Cuando intento compilar mi proyecto como una biblioteca estática, lo logra. Cuando trato como DLL, falla:

1>MessageWriter.obj : error LNK2019: unresolved external symbol "public: static class log4cplus::Logger __cdecl log4cplus::Logger::getInstance(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" ([email protected]@[email protected]@[email protected][email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@@Z) referenced in function "class log4cplus::Logger __cdecl Log(void)" ([email protected]@[email protected]@@XZ) 

Hay 4 errores más al igual que esta relacionada con las funciones dentro log4cplus.lib.

Parece que algo realmente estúpido .. por favor me ayude :)

Gracias!

Editar:

estoy vinculado con el archivo log4cplus.lib, y lo encuentra muy bien. también, el log4cplus.lib es 100% funcional, lo estoy usando en otro proyecto sin problemas. Mi intención original era compilar mi proyecto como una biblioteca estática y utilizarlo en otro DLL que estoy escribiendo, pero cuando hacer esto, tengo los mismos errores de enlace en ese otro proyecto ...

Edición # 2:

Las funciones que causan los errores del enlazador son funciones estáticas ... ¿podría ser esto parte del problema?

Respuesta

1

¿Está realmente vinculando con el archivo log2cplus.lib? Si estuvieras compilando como una biblioteca estática, entonces vincularías a ella a través del .exe final y no en la biblioteca estática. Tal vez esa sea la diferencia.

+0

sí, estoy enlazando con el archivo log4cplus.lib ... – Roey

+0

OK fresco - y está en la ruta de la biblioteca? – trojanfoe

+0

sí, encuentra el archivo con seguridad (cuando cambio el nombre de la libración a una compilación falsa falla de inmediato) ... No entiendo por qué no encuentra estas funciones dentro de log4cplus.lib ... :( – Roey

4

Cuando está creando una biblioteca estática, el creador de la biblioteca no intenta resolver todas las funciones que está utilizando (las que están en log2cplus.lib). Estas funciones se resuelven cuando crea un ejecutable que se vincula con su biblioteca estática.

Cuando está creando una biblioteca dinámica, el creador de la biblioteca (el vinculador) intenta resolver todas las funciones que está utilizando. Debe proporcionar el vinculador con la biblioteca log4cplus.lib tan pronto como cree la biblioteca dinámica. No puedes esperar hasta que crees el ejecutable.

+0

Lo he proporcionado con log4cplus.lib .... Lo he agregado a la parte del "enlazador" de las propiedades del proyecto ... – Roey

+0

Encuentra el archivo con seguridad ... como he establecido a continuación ... simplemente no reconoce algunas funciones en él por alguna razón ... – Roey

0

¿Usó __declspec (dllimport) y __declspec (dllexport)?

No son necesarios al enlazar bibliotecas estáticas, pero son necesarios para las DLL. La función debe declararse para exportar (en la DLL), para que los usuarios puedan usarla fuera (y así importarla de la DLL).

Tal vez esto puede ayudar:

importar en una aplicación con __declspec (dllimport)

http://msdn.microsoft.com/en-us/library/8fskxacy%28VS.80%29.aspx

mejores deseos

0

Si está utilizando un compilador como MSVC, entonces puede ha cambiado la configuración del proyecto sin que usted lo sepa al cambiar de lib a dll. Debe verificar que en el modo DLL, esté correctamente vinculado a la lib.

2

En cualquier caso, debe vincular con la biblioteca.

La diferencia es que cuando se vincula estáticamente, toda la funcionalidad está vinculada a través de la biblioteca que está utilizando.

Cuando establezca vínculos dinámicos, enlazará con la biblioteca de importación que tiene la funcionalidad para cargar y usar funciones de dll y le falta este paso. Por lo general, la biblioteca de importación tiene el mismo nombre que el dll con el que está enlazando.

Editar:

lo vi ese símbolo que falta no es '__imp ...' Esto significa que el archivo de cabecera no está "configurado" para la vinculación dinámica, probablemente porque tiene LOG4CPLUS_BUILD_DLL o log4cplus_EXPORTS o DLL_EXPORT no definido en proyecto donde incluye encabezados Log4Cplus.

+0

¿Dónde debería colocar el archivo DLL? – Roey

+0

¿No debería cargarse el DLL solo en tiempo de ejecución? ¿Por qué el enlazador estaría tratando de encontrarlo? – Roey

+0

Correcto, pero necesita información sobre qué dll y cómo acceder, ya que hay bibliotecas de importación. Creo que sé lo que está mal, mira mi actualización. – XAder

0

Hay dos posibilidades que puedo ver el error de vinculador:

  1. Ha compilado el log4cplus.dll (y la biblioteca de importación log4cplus.lib asociada) utilizando la configuración de generación de lanzamiento prevista, pero ahora su la aplicación se compila con la opción "Conjunto de caracteres" establecida en "Usar conjunto de caracteres Unicode"

  2. O está intentando usar log4cplus 'biblioteca estática pero definiendo LOG4CPLUS_BUILD_DLL para su aplicación.

Apuesto al número 1. Podría ser algo más, todavía. ¿Qué versión de log4cplus estás usando?

Si desea usar log4cplus.dll en su aplicación, defina el símbolo LOG4CPLUS_BUILD_DLL. log4cplus_EXPORTS y DLL_EXPORT solo están disponibles para admitir el sistema de compilación basado en CMake y el sistema de compilación basado en autotools en MingGW, respectivamente.

6

wilx es correcto.Tengo el mismo problema de enlace.

me tomó casi un día resolver este problema.

He descargado log4cplus-1.0.4, después de abrir este proyecto con visual studio 2010, compilarlo, biblioteca estática y dinámica, sin error.

Sin embargo, cuando trato de usar esas bibliotecas, recibo un error de enlace, sin importar la biblioteca estática o la biblioteca dinámica.

La razón es que, por defecto, los proyectos usan caracteres de varios bytes, sin embargo, mi propio proyecto usa unicode, por lo tanto, para solucionar ese problema de enlace, solo necesita cambiar el juego de caracteres de un proyecto.

unicode o ambos caracteres de varios bytes.

y para cambiar el juego de caracteres de un proyecto en visual studio 2010, consulte el siguiente enlace.

How do I turn off Unicode in a VC++ project?

Cuestiones relacionadas