2009-03-02 15 views
11

Tengo una solución con varios proyectos. Tengo un proyecto "principal", que actúa como un menú y desde allí, el usuario puede acceder a cualquiera de los otros proyectos. En este proyecto principal, recibo errores de enlazador para cada función llamada. ¿Cómo evito estos errores de enlazador? Establecí las dependencias del proyecto ya en el diálogo "Dependencias del proyecto ...".Errores del enlazador entre proyectos múltiples en Visual C++

Gracias

Edición - Me hicieron como se sugiere y se añade la carpeta de salida a los directorios adicionales del enlazador. Ahora, sin embargo, consigo un millón de errores de la siguiente manera:

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" ([email protected][email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" ([email protected][email protected]@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" ([email protected][email protected]@[email protected]@SAHXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@QBEDXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " ([email protected][email protected]@@QBEHXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " ([email protected][email protected]@@QBEHXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" ([email protected][email protected]@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " ([email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " ([email protected][email protected]@@QBE_NXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" ([email protected][email protected][email protected]@[email protected]@@[email protected]@QAEXXZ) already defined in panels.lib(panel_main.obj) 
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" ([email protected]@[email protected]@@[email protected]) already defined in panels.lib(panel_main.obj) 
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" ([email protected]@[email protected]) already defined in msvcprtd.lib(locale0_implib.obj) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" ([email protected]@[email protected]@@[email protected]@Z) already defined in msvcprtd.lib(locale0_implib.obj) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" ([email protected]@[email protected]@[email protected]@XZ) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" ([email protected]@[email protected]@[email protected]@XZ) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" ([email protected][email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" ([email protected][email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" ([email protected]@@[email protected]@Z) already defined in msvcprtd.lib(MSVCP90D.dll) 
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" ([email protected]@@[email protected]) already defined in msvcprtd.lib(MSVCP90D.dll) 

Respuesta

11

Sin conocer ningún otro detalle sobre su solución es difícil de decir, sin embargo, volver a generar todo, podría ser útil. Esta situación a veces puede ocurrir cuando hay archivos de objetos mixtos para diferentes arquitecturas.

También puede ser que desee considerar el uso de "Referencias" en lugar de "dependencias"

EDIT:

Después de lo que has publicado, parece que su vinculación con las bibliotecas estándar es inconsistente. ¿Podría ser que uno de los proyectos vincula las bibliotecas estándar estáticamente mientras que otras dinámicamente? (Ver propiedades del proyecto-> enlazador) ¿O uno para el tiempo de ejecución de la versión, mientras que otros para depurar? (aunque el último debería ser posible, con advertencias)

+0

Creo que las referencias solo se usan para proyectos .NET. Si bien el OP no dijo esto de una manera u otra, supongo que está escribiendo en C++ no administrado. – Andy

+0

Uso referencias en C++ no administrado, funcionan perfectamente. – EFraim

+3

Gracias por mencionar un enlace inconsistente (/ MT versus/MD). No había pensado en eso y hacer esto consistente resolvió mis errores de LNK2005. –

0

Supongo que los errores del enlazador que está obteniendo son para "símbolos no resueltos"?

Si utiliza bibliotecas estáticas (es decir, archivo .lib), deberá agregar la biblioteca a la entrada del vinculador, de modo que en el momento de la vinculación los símbolos se puedan vincular. Si no lo hace, obtendrá un símbolo sin resolver:

  1. Haga clic derecho en el proyecto y seleccione Propiedades.
  2. Seleccionar propiedades de configuración-> Enlazador-> Entrada
  3. Ingrese el nombre de la biblioteca (por ejemplo, nombredearchivo.lib) bajo Dependencias Adicionales.
+1

Cuando agrega una Dependencia de proyecto en Visual Studio, se vincula automáticamente con el resultado del proyecto (sin embargo, no agrega .lib a las Propiedades). – Andy

20

Es difícil de responder sin conocer todos los detalles sobre su solución, pero supongo que su "otro" proyecto está configurado para producir un archivo .lib, y el proyecto principal luego vincula todos estos archivos lib. Si ese es el caso, una posible causa de los errores que está recibiendo es que sus proyectos se vinculan a diferentes versiones de la biblioteca de tiempo de ejecución.

De Microsoft's documentation, "Todos los módulos pasados ​​a una invocación determinada del vinculador deben haberse compilado con la misma opción de compilador de biblioteca en tiempo de ejecución (/ MD,/MT,/LD)."

Intente cambiar todos los proyectos para usar la misma versión de la biblioteca de tiempo de ejecución. En Visual Studio 2010, esto está en las propiedades del proyecto | Propiedades de configuración | C/C++ | Generación de código | Biblioteca de ejecución. Elija DLL de depuración multiproceso o Depuración multiproceso (para la configuración de depuración).

+0

¡Gracias, Dani! Tuve este problema y tu solución fue correcta. Mi biblioteca estática tenía su Biblioteca de tiempo de ejecución establecida en "Depuración multiproceso", mientras que la aplicación que se vinculaba a ella estaba configurada como "DLL de depuración multiproceso". Cambiar la configuración de la Biblioteca de tiempo de ejecución para que todo coincida solucionó los errores del vinculador. – vocaro

+0

Esto estaba causando el error para mí. Muchas gracias – rinormaloku

1

Los errores que está recibiendo son 'error LNK2005', donde un símbolo en la biblioteca que se está ligando (MSVCPRTD.lib) ya ha sido definido de otra biblioteca (por ejemplo panels.lib). Si agrega panels.lib al campo 'ignorar biblioteca específica' (en Propiedades de configuración VS2008 -> Enlazador -> Entrada -> Ignorar bibliotecas específicas), los errores se detendrán.

0

Tuve un problema muy similar a este, que resultó ser porque una de mis bibliotecas tenía la opción 'Tratar wchar_t como tipo incorporado' establecido en un valor diferente a los demás. Esta configuración es falsa por defecto en nuevos proyectos. Cambiarlos todos a verdadero solucionó el problema.

0

Exactamente, al menos uno de sus proyectos se compila con una "Biblioteca de tiempo de ejecución" diferente a continuación, los demás. Tal vez haya agregado uno nuevo usando el predeterminado que es diferente. Compruebe las propiedades de sus proyectos por el mismo valor de "Propiedades de configuración" -> "C/C++" -> "Generación de código" -> "Biblioteca de tiempo de ejecución".

+0

¿No es esto exactamente lo que dijo Dani van der Meer tres años antes? –

0

En mi caso, el problema se debía a que había conservado los prototipos de funciones, las definiciones de clases y la implementación de funciones y la implementación de clases en un único archivo cpp. Solo cuando cambié las declaraciones y los prototipos a un archivo de cabecera por separado, estos errores desaparecieron. ¡Muy raro!

Cuestiones relacionadas