Errores al compilar en Visual C++ 2005

Czhincksx

Hola. Tengo que sacar un código en versión release con las opciones de proyecto de generar código Multiproceso MT para que no haga falta ningún archivo adicional para ajecutarlo.

El problema es que sin esa opción activada compila bien y saca bien la versión release, pero con ella activada me da estos errores:

1>Generando código...
1>Vinculando...
1>msvcprt.lib(MSVCP80.dll) : error LNK2005: ya se definió "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) en editor.obj
1>msvcprt.lib(MSVCP80.dll) : error LNK2005: ya se definió "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(char const *)" (??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z) en libcpmt.lib(locale0.obj)
1>msvcprt.lib(MSVCP80.dll) : error LNK2005: ya se definió "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) en editor.obj
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: ya se definió _exit en LIBCMT.lib(crt0dat.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: ya se definió _free en LIBCMT.lib(free.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: ya se definió _realloc en LIBCMT.lib(realloc.obj)
1>MSVCRT.lib(MSVCR80.dll) : error LNK2005: ya se definió _malloc en LIBCMT.lib(malloc.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: ya se definió "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) en LIBCMT.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: ya se definió "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) en LIBCMT.lib(typinfo.obj)
1>LINK : warning LNK4098: la biblioteca predeterminada'MSVCRT' entra en conflicto con otras bibliotecas; use la biblioteca /NODEFAULTLIB:biblioteca
1>Release\editor.exe : fatal error LNK1169: se encontraron uno o más símbolos definidos simultáneamente

Vamos, ¿que me dice que hay bibliotecas referenciadas varias veces, no? El problema es que no se que bibliotecas son ni como solucionarlo. Tampoco se por que no me da errores con la opción DLL Multiproceso MD.

Shock

Los errores del linker quiere decir, o bien que te faltan dependencias adicionales por incluir en las opciones generales del proyecto (Alt+F7) -> C/C++ -> General -> Additional Include Dependencies ,o bien que el linker no puede encontrar un .lib al que el código está llamando (Alt+F7) -> Linker -> Input -> Additional Dependencies.

En cuanto a los archivos .lib cuidado porque hay veces que los desarrolladores generan un .lib para hacer un build directo del proyecto y otro .lib para cuando estás debugeando el proyecto, hay que añadir el correcto.

En tu caso parece ser o bien que has añadido dos veces un .lib o bien que dentro del código hay algún lado donde las directivas del preprocesador, estilo #if ndef, no están funcionando bien y te definen una dependecia adicional dos veces.

PD: O eso creo xD

Czhincksx

OK gracias. Voy a ver si veo algo estraño en el código y si no intentaré que me lo compile algún compañero sustituyendo en su proyecto su código por el mio. Es muy cutre, pero las librerías a las que hace referencia el error no tengo ni idea de cuales son...

Shock

Yo si fuera tú empezaría a buscar en google por ésta línea:

1>LINK : warning LNK4098: la biblioteca predeterminada'MSVCRT' entra en conflicto con otras bibliotecas; use la biblioteca /NODEFAULTLIB:biblioteca

Tiene pinta de ser la solución que buscas, pero tendrás que irte a google a ver qué encuentras.

PD: Como ésto

http://www.emulespana.net/foros/lofiversion/index.php/t31656-100.html

Y en inglés: http://www.google.es/search?hl=es&client=firefox-a&rls=org.mozilla%3Aes-ES%3Aofficial&hs=eOJ&q=1%3ELINK+%3A+warning+LNK4098%3A+%27MSVCRT%27+%2FNODEFAULTLIB%3A&btnG=Buscar&meta=

Y después de leer un poco creo que la solución esta aquí:

http://msdn.microsoft.com/en-us/library/6wtdswk0.aspx

Al parecer hay que ignorar algunas librerías para poder usar msvcrt.lib, ahí te explican cuáles son y cómo ignorarlas.

Czhincksx

OK muchísimas gracias. Voy a leerlo.

Shock

De nada, espero que te sirva.

B

Implementar multiprocesador no es tan fácil como marcarlo en el compilador y a tirar. El programa debe estar optimizado previamente.

Nada, he leido multiprocesador en vez de multihilo.

Usuarios habituales