solucionar - ¿Qué es la biblioteca C runtime?
solucionar error visual c++ runtime library (8)
Al principio, debemos entender qué es una Biblioteca de tiempo de ejecución; y piense lo que podría significar con "Microsoft C Runtime Library".
ver: http://en.wikipedia.org/wiki/Runtime_library
He publicado la mayor parte del artículo aquí porque podría actualizarse.
Cuando un compilador traduce el código fuente de un programa informático al idioma de destino respectivo, provocaría una ampliación extrema del código del programa si cada comando en el programa y cada llamada a una función incorporada causara la generación in situ. del código de programa respectivo completo en el idioma de destino cada vez. En cambio, el compilador a menudo utiliza funciones auxiliares específicas del compilador en la biblioteca de tiempo de ejecución a las que la mayoría de los programadores de aplicaciones no tienen acceso. Según el fabricante del compilador, la biblioteca de tiempo de ejecución a veces también contendrá la biblioteca estándar del compilador respectivo o se incluirá en ella.
También algunas funciones que pueden realizarse solo (o son más eficientes o precisas) durante el tiempo de ejecución se implementan en la biblioteca de tiempo de ejecución, por ejemplo, algunos errores lógicos, comprobación de límites de matriz, comprobación dinámica de tipos, manejo de excepciones y posiblemente la funcionalidad de depuración. Por esta razón, algunos errores de programación no se descubren hasta que el programa se prueba en un entorno "en vivo" con datos reales, a pesar de sofisticadas comprobaciones en tiempo de compilación y pruebas preliminares. En este caso, el usuario final puede encontrar un mensaje de error de tiempo de ejecución.
Por lo general, la biblioteca de tiempo de ejecución realiza muchas funciones accediendo al sistema operativo. Muchos lenguajes de programación tienen funciones integradas que no necesariamente tienen que realizarse en el compilador, pero pueden implementarse en la biblioteca de tiempo de ejecución. Por lo tanto, el límite entre la biblioteca de tiempo de ejecución y la biblioteca estándar corresponde al fabricante del compilador. Por lo tanto, una biblioteca de tiempo de ejecución siempre es específica del compilador y específica de la plataforma.
El concepto de una biblioteca de tiempo de ejecución no debe confundirse con una biblioteca de programas ordinaria como la creada por un programador de aplicaciones o entregada por un tercero o una biblioteca dinámica, lo que significa una biblioteca de programas vinculada en tiempo de ejecución. Por ejemplo, el lenguaje de programación C solo requiere una biblioteca de tiempo de ejecución mínima (comúnmente llamada crt0) pero define una biblioteca estándar grande (llamada biblioteca estándar C) que cada implementación debe entregar.
¿Qué es realmente una biblioteca C runtime y para qué se utiliza? Estaba buscando, buscando en Google como un demonio, pero no pude encontrar nada mejor que Microsoft: "La biblioteca de Microsoft en tiempo de ejecución proporciona rutinas para la programación del sistema operativo Microsoft Windows. Estas rutinas automatizan muchas tareas de programación comunes que no son provistas por los lenguajes C y C ++ ".
OK, entiendo eso, pero por ejemplo, ¿qué hay en libcmt.lib
? ¿Qué hace? Pensé que la biblioteca estándar de C era una parte del compilador de C. Entonces, libcmt.lib
la implementación de Windows de libcmt.lib
de las funciones estándar de la biblioteca C funciona bajo win32?
C es un lenguaje y, en su definición, no es necesario que haya funciones disponibles para usted. Sin IO, sin rutinas matemáticas, etc. Por convención, hay un conjunto de rutinas disponibles para usted que puede vincular a su ejecutable, pero no necesita usarlas. Sin embargo, esto es algo tan común que la mayoría de los vinculadores ya no le piden que se vincule con las bibliotecas de tiempo de ejecución de C.
Hay momentos en que no los quiere, por ejemplo, al trabajar con sistemas integrados, podría ser poco práctico tener malloc, por ejemplo. Solía trabajar en la integración de PostScript en impresoras y teníamos nuestro propio conjunto de bibliotecas de tiempo de ejecución que eran mucho más felices en los sistemas integrados, por lo que no nos molestamos con el "estándar".
Creo que la definición de Microsoft realmente significa:
La implementación de Microsoft de la biblioteca de tiempo de ejecución C estándar proporciona ...
Hay tres formas de la biblioteca en tiempo de ejecución C proporcionada con el SDK de Win32:
* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT.
La edición de Microsoft Visual C ++ de 32 bits también contiene estas tres formas, sin embargo, la CRT en una DLL se llama MSVCRT.LIB. La DLL es redistribuible. Su nombre depende de la versión de VC ++ (es decir, MSVCRT10.DLL o MSVCRT20.DLL). Sin embargo, tenga en cuenta que MSVCRT10.DLL no es compatible con Win32s, mientras que CRTDLL.LIB es compatible con Win32s. MSVCRT20.DLL viene en dos versiones: una para Windows NT y la otra para Win32s.
ver: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9
La biblioteca de tiempo de ejecución es aquella biblioteca que se compila automáticamente para cualquier programa C que ejecute. La versión de la biblioteca que usaría depende de su compilador, plataforma, opciones de depuración y opciones de subprocesamiento múltiple.
Una buena descripción de las diferentes opciones para las bibliotecas de tiempo de ejecución: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
Incluye aquellas funciones que normalmente no considera que necesitan una biblioteca para llamar:
- malloc
- enum, struct
- abs, min
- afirmar
Microsoft tiene una buena lista de sus funciones de biblioteca en tiempo de ejecución:
http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx
La lista exacta de funciones podría variar según el compilador, por lo que para iOS obtendría otras funciones como dispatch_async () o NSLog ().
Sí, libcmt es (una de varias) implementaciones de la biblioteca estándar C provista con el compilador de Microsoft. Proporcionan versiones de "depuración" y de "versión" de tres tipos básicos de bibliotecas: de subproceso único (siempre vinculado estáticamente), de subprocesamiento múltiple estáticamente enlazado y de múltiples subprocesos enlazado dinámicamente (aunque, dependiendo de la versión del compilador, usando, algunos de esos pueden no estar presentes).
Entonces, en el nombre "libcmt", "libc" es el nombre (más o menos) tradicional de la biblioteca C. El "mt" significa "multihilo". Una versión de "depuración" tendría una "d" añadida al final, dando "libcmtd".
En cuanto a las funciones que incluye, el estándar C (parte 7, si le importa) define un conjunto de funciones que debe cumplir una implementación conforme (alojada). La mayoría de los proveedores (incluido Microsoft) añaden otras funciones (por compatibilidad, para proporcionar capacidades que las funciones estándar no abordan, etc.). En la mayoría de los casos, también contendrá algunas funciones "internas" que el compilador utilizará. pero normalmente no por el usuario final.
Si desea obtener una lista completa de las funciones en "libcmt" (para usar su ejemplo) puede abrir una de las solicitudes de comando de Visual Studio (normalmente en "Visual Studio Tools"), cambie al directorio donde estaban sus bibliotecas instalado, y escriba algo como: lib -list libcmt.lib
y generará una lista ( larga ) de los nombres de todos los archivos objeto en esa biblioteca. Esos no siempre se corresponden directamente con los nombres de las funciones, pero generalmente dan una idea. Si desea ver un archivo de objeto en particular, puede usar lib -extract
para extraer uno de esos archivos de objeto, luego use `dumpbin / symbols ''para encontrar qué función (es) es / son en ese archivo de objeto en particular.
Si utiliza una herramienta como Dependency Walker en un archivo ejecutable compilado de C o C ++, verá que uno de los DLL de los que depende es MSVCRT.DLL. Esta es la Biblioteca en tiempo de ejecución de Microsoft C. Si además examina MSVCRT.DLL con DW, verá que aquí es donde todas las funciones como printf (), pone (0, gets (), atoi () etc. en vivo.
Simplemente me pregunté esto y me estaba lastimando el cerebro durante algunas horas. Todavía no encontré nada que realmente haga un punto. Todos los que escriben algo sobre un tema no pueden realmente "enseñar". Si desea enseñar a alguien, tome el idioma más básico que una persona entienda, para que no tenga que preocuparse por otros temas cuando maneje un tema. Así que llegué a una conclusión para mí que parece encajar bien en todo este caos.
En el lenguaje de programación C, cada programa comienza con la función main (). Otros idiomas pueden definir otras funciones donde se inicia el programa. Pero un procesador no sabe main (). Un procesador solo conoce comandos predefinidos, representados por combinaciones de "0" y "1".
En la programación de microprocesadores, al no tener un sistema operativo subyacente (Microsoft Windows, Linux, MacOS, ...), debe decirle al procesador explícitamente dónde comenzar configurando ProgrammCounter (PC) que itera y salta (bucles, llamadas de función) dentro de los comandos conocidos por el procesador. Necesita saber qué tan grande es la RAM, necesita establecer la posición de la pila de programa (variables locales), así como la posición del montón (variables dinámicas) y la ubicación de las variables globales (supongo que se llamó SSA ?) dentro de la RAM. Un solo procesador solo puede ejecutar un programa a la vez.
Ahí es donde entra el sistema operativo. El sistema operativo en sí es un programa que se ejecuta en el procesador. Un programa que permite la ejecución de código personalizado. Ejecuta múltiples programas a la vez al cambiar entre los códigos de ejecución de los programas (que se cargan en la RAM). Pero el sistema operativo ES UN PROGRAMA, cada programa está escrito de manera diferente. Simplemente poniendo el código de su programa personalizado en la RAM no lo ejecutará, el sistema operativo no lo sabe. Debe llamar a las funciones del sistema operativo que registra su programa, indicarle al sistema operativo cuánta memoria necesita el programa, dónde se encuentra el punto de entrada al programa (la función principal () en el caso de C). Y esto es lo que supongo que se encuentra dentro de RuntimeLibrary, y explica por qué necesita una biblioteca especial para cada sistema operativo, porque estos son solo programas en sí mismos y tienen diferentes funciones para hacer esto.
Esto también explica por qué NO está dinámicamente vinculado en el tiempo de ejecución como archivos .dll, incluso si se llama RUNTIMELibrary. RuntimeLibrary debe vincularse estáticamente, porque es necesario al inicio de su programa. RuntimeLibrary inyecta / conecta su programa personalizado en / a otro programa (el sistema operativo) en RUNTIME. Esto realmente causa algo de cerebro ...
Conclusión: RUNTIMELibrary es un error al nombrar. Puede que no haya existido .dll (enlace en tiempo de ejecución) en los primeros tiempos y el problema de comprender la diferencia simplemente no existía. Pero incluso si esto es cierto, el nombre está mal elegido.
Los mejores nombres para RuntimeLibrary podrían ser: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary
Espero haberlo hecho bien, listo para la corrección / aplausos de expansión.