Pregunta

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

Gracias

EDITAR: hice lo sugerido y agregué la carpeta de salida a los directorios adicionales del enlazador. Ahora, sin embargo, recibo 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)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) 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)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) 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 &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) 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 " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@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 " (?flags@ios_base@std@@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 " (?width@ios_base@std@@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 *)" (?length@?$char_traits@D@std@@SAIPBD@Z) 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)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) 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 " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@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)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@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)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) 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 *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@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 *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) 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 *)" (?facet_Register@facet@locale@std@@CAXPAV123@@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)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@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)" (?_Init@locale@std@@CAPAV_Locimp@12@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 &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@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 *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
¿Fue útil?

Solución

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

También es posible que desee considerar el uso de " Referencias " en lugar de " dependencias "

EDIT:

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

Otros consejos

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

De documentación de Microsoft , " Todos los módulos pasados ??a una invocación dada 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 se encuentra en las Propiedades del proyecto | Propiedades de configuración | C / C ++ | Generación de Código | Biblioteca de ejecución. Elija Debug Multi-threaded DLL o Multi-threaded Debug (para su configuración de depuración).

¿Se exportan las funciones en sus otros proyectos? Si no se exportan, entonces no hay nada que vincular desde el exe principal, por lo que podría causar los errores. Consulte Exportación desde una DLL usando __declspec (export) para más información.

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

Supongo que los errores del vinculador que está recibiendo son para " símbolos no resueltos " ;?

Si usa bibliotecas estáticas (es decir, archivo .lib), deberá agregar la biblioteca a la entrada del enlazador, de modo que en el momento del enlace se puedan vincular los símbolos. Si no haces esto, obtendrás un símbolo sin resolver:

  1. Haga clic con el botón derecho en el proyecto y seleccione Propiedades.
  2. Seleccione Propiedades de configuración - > Vinculador- > Entrada
  3. Introduzca el nombre de la biblioteca (por ejemplo, filename.lib) en Dependencias adicionales.

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

Exactamente, al menos uno de sus proyectos se compila con una " Biblioteca de Runtime " luego los otros Tal vez haya agregado uno nuevo usando el predeterminado que es diferente. Verifique las propiedades de sus proyectos para el mismo valor de " Propiedades de configuración " - > " C / C ++ " - > " Generación de código " - > " Biblioteca de tiempo de ejecución " ;.

En mi caso, el problema se debía a que había mantenido los prototipos de funciones, las definiciones de clase y la implementación de la función y la implementación de la clase en un solo archivo cpp. Solo cuando cambié las declaraciones y los prototipos a un archivo de encabezado separado, estos errores desaparecieron. Realmente raro!

En mi caso, tengo dos métodos:

  1. Propiedades del proyecto - > C / C ++ - > Generación de código - > Runtime Library. cámbielo a MT.

  2. Agregue su biblioteca de falta a: Linker- > Entrada - > Dependencias adicionales. Si no funciona, intente agregar una ruta completa en lugar de un nombre de biblioteca.

Por ejemplo: C: \ Archivos de programa (x86) \ Microsoft Visual Studio 14.0 \ VC \ lib \ amd64 \ libvcruntime.lib;

Eso funciona para mí. Responda esta pregunta para cualquier persona que necesite ayuda.

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