¿Qué es el compilador GCC?

Gcc para Linux (GNU C Compiler) es un compilador multiplataforma potente y de alto rendimiento lanzado por GNU. Es una de las obras maestras de GNU. gcc es un supercompilador que puede compilar programas ejecutables en una variedad de plataformas de hardware. Su eficiencia de ejecución es en promedio entre un 20% y un 30% mayor que la eficiencia promedio del compilador.

El compilador gcc puede compilar y vincular programas fuente en lenguaje C y C++, secuencias de programación reorganizadas y programas de destino en archivos ejecutables. Si no se proporciona ningún nombre para el ejecutable, gcc generará un archivo llamado a.out. En Linux, los archivos ejecutables no tienen un sufijo unificado. El sistema distingue los archivos ejecutables de los no ejecutables mediante atributos de archivo. En cambio, gcc distingue las categorías de archivos de entrada mediante sufijos. A continuación presentaremos algunas reglas de convención seguidas por gcc.

El archivo con el sufijo .c es un archivo fuente C

El archivo con el sufijo .a es un archivo compuesto por archivos de destino

; Los archivos con sufijo denominados .C, .cc o .cxx son archivos fuente de C++;

Los archivos con el sufijo .h son archivos de encabezado incluidos en el programa;

Los archivos con el sufijo . Los archivos de i son archivos preprocesados.

Los archivos con el sufijo .m son archivos fuente Objective-C

Los archivos con el sufijo .o son archivos objeto compilados

Los archivos con; el sufijo .s es un archivo fuente en lenguaje ensamblador;

.archivo fuente en lenguaje ensamblador;

el archivo con el sufijo .S es un archivo fuente en lenguaje ensamblador precompilado.

El proceso de ejecución de Gcc

Aunque llamamos a Gcc un compilador de C, el proceso de usar gcc para generar un archivo ejecutable a partir de un archivo fuente de C no es solo un proceso de compilación; pasa por cuatro pasos interrelacionados: preprocesamiento (también conocido como precompilación, Preprocesamiento), compilación (Compilation), ensamblaje (Assembly) y vinculación (Linking).

El comando gcc primero llama a cpp para el preprocesamiento. Durante el proceso de preprocesamiento, se analizan el archivo include (include) y las declaraciones precompiladas (como definiciones de macros, etc.) en el archivo de código fuente. Luego llame a cc1 para compilar. En esta etapa, se genera un archivo objeto con un sufijo .o basado en el archivo de entrada. El proceso de compilación es un paso en el que el lenguaje ensamblador realiza el mismo trabajo que la llamada. En términos generales, los archivos de código fuente en lenguaje ensamblador con el sufijo .S y los archivos en lenguaje ensamblador y ensamblador con el sufijo .s se generan después de la precompilación y la compilación. Los archivos con el sufijo .o sirven como archivos objeto. Una vez generados todos los archivos objeto, gcc llama a ld para completar el trabajo crítico final, la fase de vinculación. Durante la fase de vinculación, todos los archivos objeto se colocan en las ubicaciones apropiadas del programa ejecutable, y las funciones de la biblioteca llamadas por el programa también se vinculan a las ubicaciones apropiadas desde sus respectivos archivos.

Uso básico y opciones de Gcc

Al utilizar el compilador Gcc, debemos dar una serie de parámetros de llamada y nombres de archivos necesarios. Hay alrededor de 100 parámetros de llamada del compilador Gcc, la mayoría de los cuales es posible que no usemos en absoluto, por lo que aquí solo presentamos los parámetros más básicos y comúnmente utilizados.

El método más básico para usar Gcc es: gcc [opciones] [nombres de archivo]

Entre ellas, las opciones son los parámetros requeridos por el compilador y los nombres de archivo dan el nombre del archivo relacionado. archivo.

-c, solo compila, no vincula al archivo ejecutable. El compilador simplemente genera un archivo objeto con un sufijo .o a partir del .c de entrada y otros archivos fuente. -programas que no contienen los archivos del programa principal.

-o nombre_archivo_salida determina el nombre del archivo de salida como nombre_archivo_salida, y el nombre no puede ser el mismo que el del archivo fuente. Si no se proporciona esta opción, gcc proporcionará el ejecutable predeterminado a.out.

-g, genera la información de símbolos necesaria para la herramienta de depuración simbólica (gdb de GNU). Para depurar el código fuente, debemos incluir esta opción.

-O, optimizar la compilación y el enlace. Al usar esta opción, todo el código fuente se optimizará durante el proceso de compilación y enlace, mejorando así la eficiencia de ejecución del archivo ejecutable generado, pero la velocidad de compilación y enlace. será la desaceleración correspondiente.

-O2, el efecto de optimización durante la compilación y vinculación es mejor que -O, por supuesto, todo el proceso de compilación y vinculación será más lento.

-Idirname es un parámetro utilizado durante el proceso de precompilación, que agrega el directorio indicado por dirname a la lista de directorios de archivos de encabezado del programa. Los archivos de encabezado en programas C se incluyen en dos situaciones:

A)#include

B)#include "myinc.h "

Entre ellos, clase A Utilice corchetes angulares (< >), la Clase B utiliza comillas dobles (" "). Para la clase A, el preprocesador cpp buscará el archivo correspondiente en el directorio de archivos de inclusión predeterminado del sistema (como /usr/include), mientras que para la clase B, cpp buscará el archivo de encabezado en el directorio actual. El propósito de esta opción es indicarle a cpp que vaya al directorio de nombre de directorio especificado si el archivo requerido no se puede encontrar en el directorio actual. En programación, si necesitamos que estos archivos de inclusión estén distribuidos en diferentes directorios, debemos usar la opción -I para dar las rutas de búsqueda una por una.

-Ldirname agrega el directorio indicado por dirname a la lista de directorios del archivo de funciones del programa y es un parámetro utilizado durante el proceso de vinculación. De forma predeterminada, el vinculador ld busca la biblioteca de archivos requerida en la ruta predeterminada del sistema (como /usr/lib). Si la biblioteca de funciones se coloca en varios directorios, es necesario utilizar esta opción en secuencia para proporcionar el directorio de almacenamiento correspondiente.

-lname carga una biblioteca llamada "libname.a" en el momento del enlace, que se encuentra en el directorio predeterminado del sistema o en un directorio determinado por la opción -L. Por ejemplo, -lm significa vincular con la biblioteca matemática denominada "libm.a".

Lo anterior es una breve introducción a las funciones más utilizadas y los parámetros principales del compilador gcc. Para obtener más detalles, consulte la ayuda en línea de Linux.

Si tenemos un archivo fuente en C llamado test.c, la forma más sencilla de generar un ejecutable es

gcc test.c

y luego Precompilación y compilación La vinculación se completa para generar un archivo ejecutable predefinido llamado a.out, pero para situaciones un poco más complejas, como múltiples archivos fuente y la necesidad de vincular archivos, el compilador gcc se puede usar como archivo ejecutable. Para casos un poco más complejos, como múltiples archivos fuente, la necesidad de conectarse a un archivo u otros requisitos más específicos, debemos proporcionar los parámetros de opción de compra correspondientes. Veamos un ejemplo sencillo.

El programa fuente completo consta de dos archivos: testmain.c y testsub.c. El programa utiliza la biblioteca matemática proporcionada por el sistema. Si desea nombrar el archivo ejecutable prueba, puede usar el siguiente comando para compilar:

gcc testmain.c testsub.c □lm □o test <. /p>

Donde -lm significa conectarse al archivo.

Tipos de errores de Gcc y contramedidas

Si el compilador de Gcc encuentra errores en el programa fuente, no podrá continuar compilando ni generar el archivo ejecutable final. Para facilitar la modificación, después de que gcc genera mensajes de error, debemos analizar y procesar estos mensajes de error uno por uno y modificar el idioma correspondiente para garantizar que el código fuente esté compilado y conectado correctamente. Los mensajes de error proporcionados por gcc generalmente se pueden dividir en cuatro categorías. A continuación analizamos sus causas y contramedidas, respectivamente.

Categoría 1: Error de sintaxis de C

Mensaje de error: Se produce un error de sintaxis en la línea n del archivo source.c. Este tipo de error es generalmente un error de sintaxis en el lenguaje C. Debe verificar cuidadosamente la enésima línea del archivo de código fuente y el programa antes de esta línea. A veces también es necesario verificar los archivos de encabezado incluidos en el archivo. En algunos casos, gcc representará un error de sintaxis muy simple con numerosos errores.

Lo principal que debemos hacer es mantener la cabeza despejada y no dejarnos intimidar por ello. Si es necesario, puede consultar el libro de texto básico en lenguaje C.

Categoría 2: Error del archivo de encabezado

Mensaje de error: No se puede encontrar el archivo de inclusión head.h (No se puede encontrar el archivo de inclusión head.h). Este tipo de error es un problema con los archivos de encabezado incluidos en los archivos de código fuente. Las posibles razones incluyen el nombre incorrecto del archivo de encabezado, el nombre incorrecto del directorio donde se encuentra el archivo de encabezado especificado o el uso incorrecto de comillas dobles y corchetes angulares.

El tercer tipo: error de biblioteca

Mensaje de error: el vinculador no puede encontrar la biblioteca requerida, por ejemplo:

ld: -lm: No existe tal archivo o directorio

Este tipo de error es un error en la biblioteca conectada al archivo de destino. Las posibles razones incluyen un nombre de biblioteca incorrecto, un nombre incorrecto del directorio donde se encuentra la biblioteca, etc. El método de verificación es verificar. si el nombre de la biblioteca es incorrecto. El método de verificación es usar el comando de búsqueda para encontrar el nombre de la biblioteca en posibles directorios, determinar el nombre de la biblioteca y el nombre del directorio, y modificar el nombre de la biblioteca en el programa y las opciones de compilación.

Tipo 4: Símbolo no definido

Mensaje de error: Hay un símbolo no definido. Este tipo de error ocurre durante el proceso de conexión. Puede haber dos razones: primero, las funciones o variables globales definidas por el usuario no están compiladas y conectadas en el archivo de código fuente, o no están definidas en absoluto, lo que requiere que el usuario lo haga. modifique el programa fuente de acuerdo con la situación real, proporciona el cuerpo de definición de variables o funciones globales; los símbolos indefinidos son funciones de biblioteca estándar, las funciones de biblioteca se utilizan en el programa fuente y las funciones de biblioteca estándar también se utilizan en el proceso de conexión. Si se trata de una función de biblioteca estándar y el nombre de la función de biblioteca correspondiente no se proporciona durante el proceso de conexión, o hay un problema con el nombre del directorio de la biblioteca de archivos, entonces debemos usar el comando de mantenimiento de archivos ar para verificar en qué biblioteca se ubica la función de biblioteca que necesitamos. Después de la confirmación, modifique los elementos -l y -L en la opción de conexión gcc.

Excluyendo errores en los procesos de compilación y vinculación, cabe decir que este es solo el paso más simple y básico de la programación, y se puede decir que es solo el comienzo. Los errores en este proceso son sólo errores que ocurren cuando describimos el algoritmo en lenguaje C, los cuales son relativamente fáciles de eliminar. Cuando terminamos de escribir un programa y termina con la compilación y la conexión, hay que decir que acaba de comenzar. Los problemas que surgen durante la ejecución del programa son problemas de diseño de algoritmos. comprender y comprender el problema no es suficiente y es necesario realizar más pruebas, depuración y modificación en profundidad. Un programa, un programa un poco más complejo, a menudo necesita ser compilado, conectado, probado y modificado varias veces. El mantenimiento del programa, las herramientas de depuración y el mantenimiento de la versión que aprenderemos a continuación se utilizan durante el proceso de depuración y prueba del programa para resolver los problemas que surgen durante las etapas de depuración y prueba. Parte superior de la mesa

Parte inferior de la mesa