Cómo vincular con la biblioteca C Run-Time (CRT) correcta

Seleccione idioma Seleccione idioma
Id. de artículo: 140584 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Hay seis tipos de bibliotecas reutilizables:
  • Single estático subprocesos biblioteca (Debug o Release)
  • Biblioteca estática multiproceso (Debug o Release)
  • Dinámicos Biblioteca de vínculos (DLL)(Debug/Release)
Nota Cada biblioteca tiene una versión de depuración y versión de lanzamiento.

La DLL es multiproceso seguro y una versión de subproceso único de la biblioteca CRT no se proporciona para archivos DLL. Si la biblioteca reutilizable o cualquier usuario de la biblioteca está utilizando múltiples subprocesos, a continuación, la biblioteca debe ser un tipo de biblioteca multithread-safe.

Nota Bibliotecas de depuración y modificadores del compilador /MLD, /MTd y /MDd sólo están disponibles en versiones de Visual C++ 4.0 y posterior.

La tabla siguiente muestra qué modificador del compilador debe utilizarse para crear cada uno de los seis tipos de bibliotecas reutilizables (todos los tipos DLL son multiproceso segura). Cualquier proyecto que utiliza la biblioteca reutilizable debe utilizar el mismo modificador de compilador. Al utilizar los modificadores de compilador /ML(default), / MLd, / MT, MTd, /MD o /MDd, el compilador coloca el nombre de biblioteca predeterminado (que aparece en la columna biblioteca) en el archivo objeto.
Reusable Library            Switch    Library    Macro(s) Defined
----------------------------------------------------------------
Single Threaded             /ML       LIBC       (none)
Static MultiThread          /MT       LIBCMT     _MT
Dynamic Link (DLL)          /MD       MSVCRT     _MT and _DLL
Debug Single Threaded       /MLd      LIBCD      _DEBUG
Debug Static MultiThread    /MTd      LIBCMTD    _DEBUG and _MT
Debug Dynamic Link (DLL)    /MDd      MSVCRTD    _DEBUG, _MT, and _DLL
				
puede ver un módulo de objeto para determinar qué modificador se ha utilizado cuando se creó mediante este comando:
   dumpbin /all <object>.obj
				
buscar en la sección titulada RAW DATA # 1. En la columna derecha, se mostrarán las bibliotecas predeterminadas.

Más información

Una biblioteca reutilizable y todos sus usuarios deben utilizar los mismos tipos de biblioteca CRT y, por lo tanto, el mismo modificador de compilador. Las macros definidas (o no definen) para cada opción del compilador modificadores se pueden utilizar en los archivos encabezado de la biblioteca reutilizable para exigir el modificador de compilador adecuado. El código de ejemplo en este artículo muestra cómo usar estas macros.

Si desea que los usuarios de la biblioteca para poder elegir estático o la DLL CRT, debe proporcionar estáticos y tipos de biblioteca reutilizable de DLL.

Si decide combinar bibliotecas CRT, recuerde que tiene dos copias separadas de CRT con estados independientes y distintos, por lo que debe actuar con precaución sobre lo que intenta hacer a través de un límite de CRT. Hay muchas formas de poner en problemas con dos CRTs. Éstas son sólo unos:
  • Hay dos montones independientes. No se puede asignar (explícitamente con nuevo, malloc, o lo en--o implícitamente con strdup, strstreambuf::str o etc.) y a continuación, pase el puntero a través de un límite de CRT que se va a liberar.
  • No se puede pasar un identificador de archivo o archivos * a través de un límite de CRT y esperar la "stdio E/S de bajo nivel" para trabajar.
  • No se puede establecer la configuración regional en uno y esperar del otro establecer configuración regional.
A partir de Visual C++ 4.0, el vinculador emitirá una advertencia (LNK4098) si un módulo resultante intenta combinar más de una copia de la biblioteca CRT. Para obtener más información, busque el archivo de ayuda para LNK4098.

Código de ejemplo

Se puede utilizar el código siguiente en el archivo de encabezado de biblioteca reutilizable para garantizar el uso coherente del modificador de compilador correcta:
// MyReusableStaticSingleThreadReleaseLibrary.h
#if defined(_MT) || defined(_DEBUG)
    #error The /ML compiler switch is required.
#endif

// MyReusableStaticMultithreadReleaseLibrary.h
#if !defined(_MT) || defined(_DLL) || defined(_DEBUG)
    #error The /MT compiler switch is required.
#endif

// MyReusableDynamicLinkReleaseLibrary.h
#if !defined(_MT) || !defined(_DLL) || defined(_DEBUG)
    #error The /MD compiler switch is required.
#endif

// MyReusableStaticSingleThreadDebugLibrary.h
#if defined(_MT) || !defined(_DEBUG)
    #error The /MLd compiler switch is required.
#endif

// MyReusableStaticMultithreadDebugLibrary.h
#if !defined(_MT) || defined(_DLL) || !defined(_DEBUG)
    #error The /MTd compiler switch is required.
#endif

// MyReusableDynamicLinkDebugLibrary.h
#if !defined(_MT) || !defined(_DLL) || !defined(_DEBUG)
    #error The /MDd compiler switch is required.
#endif
				

Propiedades

Id. de artículo: 140584 - Última revisión: jueves, 01 de julio de 2004 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Standard
  • Microsoft Visual C++ 6.0 Service Pack 5
  • Microsoft Visual C++ .NET 2002 Standard
  • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbcrt kbhowto KB140584 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 140584

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com