2009-06-24 6 views
6

Soy gettings este tipo de errores en un proyecto MFC VS6 durante el enlazado de la aplicación:cómo evitar el "error ya definidas" en C++

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj) 

Yo sé lo que significa (existe una función en 2 bibliotecas diferentes); para resolverlo debería excluir una de las 2 bibliotecas (msvcrt.lib o libc.lib).

Pero si hago esto, hay todo tipo de errores externos sin resolver. Entonces me gustaría seguir usando ambas bibliotecas.

¿Hay alguna manera de decirle al vinculador que quiero usar la función _atoi en libc.lib y no en msvcrt.lib (o al revés)?

Cualquier ayuda o dirección sería genial.

Respuesta

1

Parece que hay una opción que puede usar para ignorar errores como este: en projectsettings> link> marque 'Forzar salida de archivo'. Esto generará el programa incluso si hay linkerrors.

La salida Construir da algo como esto:

msvcrt.lib (msvcrt.dll): LNK4006 de advertencia: _atoi ya definido en libc.lib (atox.obj); segunda definición ignorada

Por supuesto necesitará usar esta opción con cuidado ya que puede generar una aplicación que no funcionará en algunos casos, pero aquí probablemente no haga ningún daño (espero).

Gracias por las otras respuestas, pero esa no parecía ser una opción en mi caso particular.

11

Este error ciertamente significa que está uniendo dos códigos que se han compilado utilizando distintas bibliotecas de tiempo de ejecución. MSVCRT.dll es la versión dinámica, mientras que LIBC.lib es la estática. Si haces esto, todo el infierno se desata. Intente encontrar qué partes de su código usan qué versión y resuélvala.

+1

Acabo de tener un problema similar, ya que no estoy muy familiarizado con el mundo no administrado, fue una sorpresa para mí que necesite diferentes versiones de una biblioteca de terceros dependiendo de las bibliotecas de tiempo de ejecución de su código y esa biblioteca utilizar. Descargué una lib de terceros y traté de vincularla con un proyecto en VC++ 2005. Resultó la biblioteca usada y la versión anterior de la biblioteca de tiempo de ejecución (a?) - LIBCP.LIB. Afortunadamente, la biblioteca de terceros tenía su fuente disponible, así que pude completarla con la biblioteca de tiempo de ejecución de VC2005. Me pregunto cómo resolvería esto sin la fuente. – axk

4

Tiene un conflicto de tiempo de ejecución. Usar múltiples bibliotecas de tiempo de ejecución generalmente es malo.

Puede usar/nodefaultlib: msvcrt (o/nodefaultlib: libc) en sus opciones de vinculador para excluir una u otra.

En realidad, antes de recurrir a eso, verifique la configuración de su proyecto. Si recuerdo correctamente, libc es el tiempo de ejecución de subproceso único en VS6, y msvcrt es el tiempo de ejecución de subprocesos múltiples. Si tiene varios proyectos en su solución, asegúrese de que todos estén usando uno u otro.

+1

libc es un hilo único estático. libcmt es multihilo estático. msvcrt es una DLL y multiproceso. libc ya no está disponible en las versiones actuales de MSVC. – MSalters

Cuestiones relacionadas