¿Cómo entiendo los conceptos subyacentes de las bibliotecas, incluidos archivos, archivos MAKE, indicadores de compilación, archivos de objetos y conceptos relacionados?

Bibliotecas: si tuviera que escribir código y realizar una operación una y otra vez, probablemente escribiría una función y la invocaría siempre que quisiera realizar esa operación. Ahora considere que alguien más quería realizar la misma operación para la que escribió una función. Podrían usar su código fuente y seguir invocándolo en su código. Pero compartir su fuente expondrá su IP y, por lo tanto, usted compartirá con ellos lo que se llama una “biblioteca” y ellos pueden “vincular” su código con el suyo para generar un binario ejecutable. Entonces, una biblioteca es básicamente un binario que no puede ejecutarse por sí mismo, pero expone funciones que pueden ser utilizadas por otros programas que se vinculan con ella. Si está familiarizado con el código C / C ++, funciones como printf, scanf, fopen, etc. son funciones de biblioteca implementadas como parte de la biblioteca que viene con la distribución del compilador. Nunca ve su implementación, pero cuando los usa en su código, su compilador sabe que necesita vincular su programa con la biblioteca correcta que tiene implementación para estas funciones antes de que pueda escupir un ejecutable.

Existen diferentes tipos de bibliotecas: estáticas y dinámicas. Las bibliotecas estáticas son la forma ingenua de hacer las cosas. Si su programa hace referencia a printf, el compilador copiará toda la implementación de printf en el binario de su programa para que pueda simplemente compartir su ejecutable con otra persona y simplemente funcionará sin ninguna dependencia de la biblioteca. Mientras que las bibliotecas dinámicas se cargan en tiempo de ejecución, por lo que deberá distribuir estas bibliotecas con su ejecutable.

Incluir archivos: al escribir código C / C ++ con mucha frecuencia, querrá usar constantes. Ahora, si hay varios archivos en su proyecto C / C ++ que necesitan usar exactamente las mismas constantes, puede codificarlos en todos sus archivos y luego preocuparse por la cantidad de archivos que necesitaría cambiar manualmente en caso de algún cambio constante. En su lugar, podría declarar las constantes (también declaraciones de clase, declaraciones de variables globales, declaraciones de funciones) en un archivo de encabezado e incluirlo en su código C / C ++. De esa forma, el preprocesador del compilador sustituirá automáticamente las macros con constantes en todos los archivos fuente C / C ++ y hará que su código sea menos propenso a errores y más flexible. Además, cuando invoca una función desde un archivo fuente C / C ++, el compilador necesita saber cómo pasar parámetros y esto depende de la huella de la función llamada. Por lo tanto, las declaraciones de funciones también se escriben en archivos de encabezado. Lo mismo para las declaraciones de clase. Sin declaraciones de clase, no puede desreferenciar un objeto de esa clase, pero puede transportar punteros de ese tipo.

Makefiles: si tiene un proyecto relativamente grande y desea compilarlo, hay 2 formas de hacerlo. Primero es compilar cada archivo manualmente y vincularlos todos juntos. Si cambia algún archivo, deberá recordar volver a compilarlo y vincularlo todo. Una mejor manera es crear un Makefile. Este archivo contiene un conjunto de reglas sobre dependencias de archivos. Si un archivo, el archivo A depende del archivo B, y el archivo B cambia, el sistema de archivos compilará el archivo B _y_ archivoA automáticamente. Esto garantiza que solo necesite ejecutar un comando “make” cada vez que cambie su código y en el fondo todos los archivos modificados y sus dependencias se compilarán / vincularán por usted. Pero debe asegurarse de que las dependencias se escriban correctamente en el Makefile para que todo esto funcione, por supuesto. 🙂

Banderas de compilación: los compiladores tienen muchos trucos bajo la manga para que su código se ejecute más rápido. Hoy en día, los programas se compilan para ejecutarse en un servidor o en un dispositivo portátil. Cuando se ejecuta en el primero, solo debe preocuparse por el rendimiento, pero en el segundo también debe preocuparse por la cantidad de espacio que ocupa su ejecutable. Por lo tanto, los compiladores tienen optimizaciones diseñadas para priorizar una restricción sobre otra. Al compilar para obtener rendimiento, los compiladores pueden optimizar agresivamente el código y no preocuparse por el espacio, por ejemplo, para desenrollar bucles. Mientras que cuando se optimiza para el espacio, el compilador puede hacer un intercambio de rendimiento en el espacio y priorizar el último al decir que no se desenrolla el bucle de manera tan agresiva. Hay una gran cantidad de banderas que los compiladores exponen y es divertido experimentar con ellas. Pero tenga en cuenta que algunos indicadores pueden hacer que su código sea incompatible para vincularse con otras bibliotecas.

Archivos de objetos: cuando compila su programa fuente, el compilador convierte un archivo fuente en código nativo. Y después de compilar todos los archivos fuente en su proyecto, los vinculará a todos con las bibliotecas del sistema estándar. Los archivos que su compilador escupe después del primer paso son archivos de objetos. No pueden ejecutar por sí mismos. Pero se pueden vincular varios archivos de objetos para generar un ejecutable.

Espero que esto ayude.

PD: Soy un desarrollador compilador.

Bibliotecas es término relativo. primero tenemos que saber en qué contexto estás hablando. puede haber una biblioteca completa que incluya binarios, encabezados, archivos fuente y archivos de objetos.

Makefile es un script escrito en una determinada sintaxis prescrita que ayuda a construir la salida de destino (normalmente, uno o más ejecutables) a partir de archivos fuente mediante compilación y vinculación. En palabras simples, makefile compilará su código fuente de manera simple y rápida.

Para el archivo make: – Cómo escribir el primer archivo make para el código fuente c en linux

Incluir archivos: – Archivo de encabezado que contiene declaración de función y macros

Los archivos de objetos son el resultado de la compilación del archivo fuente