software que programacion informatica enlazadores encadenadores desarrollo compilador c++ c visual-studio linker

c++ - informatica - que es un compilador en programacion



¿Por qué la biblioteca de tiempo de ejecución es una opción de compilador en lugar de una opción de enlazador? (6)

Creo que la razón detrás de esto es que el código SEH (controlador de excepciones estructuradas) se generará de manera diferente dependiendo de la biblioteca de tiempo de ejecución con la que se vincule.

Intento crear una biblioteca estática de C / C ++ utilizando Visual Studio 2005. Como la selección de la biblioteca de tiempo de ejecución es una opción de compilación, me veo forzado a crear cuatro variaciones de mi biblioteca, una para cada variación de la biblioteca de tiempo de ejecución:

  • / MT - biblioteca de tiempo de ejecución estática
  • / MD - Biblioteca de tiempo de ejecución de DLL
  • / MTd - biblioteca de tiempo de ejecución estática de depuración
  • / MDd - debug DLL biblioteca en tiempo de ejecución

Estas son opciones de compilador , no opciones de enlazador. Viniendo de un fondo de Linux, esto parece extraño. ¿Las diferentes bibliotecas de tiempo de ejecución tienen diferentes convenciones de llamadas o algo así? ¿Por qué no se pueden resolver las diferentes bibliotecas de tiempo de ejecución en el momento del enlace, es decir, cuando enlace la aplicación que utiliza mi biblioteca estática?


Estas opciones pueden agregar define (__DLL y __DEBUG por ejemplo) que se utilizan en los archivos de encabezado de la biblioteca de tiempo de ejecución. Una cosa común que hacer es agregar __declspec (dllimport) a las declaraciones de funciones cuando se vincula dinámicamente.

El compilador también parece usar estos para ayudar al enlazador a enlazarse a las bibliotecas correctas. Esto se explica en MSDN .


Si ignoras el tiempo de ejecución estático, obtienes las mismas opciones que Linux.

Sé que el tiempo de ejecución estático puede ser útil, pero en realidad nunca lo he necesitado. También conduce a problemas potenciales relacionados con la asignación / desasignación de memoria y, como resultado, me resulta más fácil simplemente utilizar el tiempo de ejecución de DLL.

Tener versión Release / Debug es lo mismo que Linux / Unix.
Aunque por eficiencias, me explico que también puedo crear un solo hilo y versiones de múltiples hilos de bibliotecas.


El compilador necesita saber si está generando un código de subproceso único o multihebra. Por defecto, el compilador genera código de seguridad de subprocesos (multiproceso). Tiene que indicar si desea un código de subproceso único. Si cambia el valor predeterminado, el compilador cambia la biblioteca de tiempo de ejecución predeterminada (siempre puede anular esto en las opciones del comando del enlazador, solo asegúrese de que la biblioteca que elija tenga el mismo código). estructura como sus archivos objeto: DLL de subproceso único estático, multi-threaded o multi-threaded). Tenga en cuenta que no existe una opción DLL de subproceso único (por definición, la DLL de la biblioteca en tiempo de ejecución se habrá creado como segura para subprocesos, ya que varias aplicaciones la comparten).


Un efecto secundario de las definiciones del preprocesador C como _DLL y _DEBUG que zdan mencionó:

Algunas estructuras de datos (como contenedores e iteradores de STL) pueden tener un tamaño diferente en el tiempo de ejecución de depuración, posiblemente debido a características como _HAS_ITERATOR_DEBUGGING y _SECURE_SCL . Debe compilar su código con definiciones de estructura que sean compatibles con binario con la biblioteca a la que está vinculando .

Si mezcla y combina archivos de objetos que se compilaron con diferentes bibliotecas de tiempo de ejecución, obtendrá advertencias de enlaces como las siguientes:

warning LNK4098: defaultlib ''LIBCMT'' conflicts with use of other libs


Hay diferentes códigos de máquina generados para DLL y bibliotecas estáticas.

Y en Linux tienes que hacer lo mismo, el indicador del compilador se llama -fPIC si quieres construir una biblioteca compartida. De lo contrario, en AMD64 y SPARC (y tal vez otros) se bloqueará. En la arquitectura i386, el enlazador es lo suficientemente inteligente y no comparte la biblioteca en la memoria para que no se cuelgue.