gcc y g++ son respectivamente los compiladores de C y C++ de GNU. Durante el trabajo de compilación, gcc/g++ necesita un total de 4 pasos:
- 1. Preprocesamiento, genera archivos .i [preprocesador cpp]
- 2. Convierte el archivo preprocesado a lenguaje ensamblador, genera archivos .s [compilador egcs]
- 3. Del ensamblador se convierte a código objeto (código máquina), generando archivos .o [ensamblador as]
- 4. Enlaza el código objeto, genera el programa ejecutable [enlazador ld]
Explicación detallada de los parámetros
-x language filename
Establece el idioma utilizado por el archivo, haciendo que la extensión no sea válida, y es efectivo para los archivos posteriores. Es decir, por convención, la extensión del lenguaje C es .c, mientras que la extensión de C++ es .C o .cpp. Si eres muy original y decides que la extensión de tu archivo de código C sea .pig, jeje, entonces tienes que usar este parámetro. Este parámetro afecta a los nombres de archivo posteriores, a menos que se use el siguiente parámetro. Los parámetros que se pueden usar son los siguientes: 'c', 'objective-c', 'c-header', 'c++', 'cpp-output', 'assembler' y 'assembler-with-cpp'.
Al ver el inglés, deberías poder entenderlo.
Ejemplo de uso:
gcc -x c hello.pig
-x none filename
Desactiva la opción anterior, es decir, permite que gcc reconozca automáticamente el tipo de archivo según su extensión.
Ejemplo de uso:
gcc -x c hello.pig -x none hello2.c
-c
Solo activa el preprocesamiento, la compilación y el ensamblado, es decir, solo convierte el programa en un archivo obj.
Ejemplo de uso:
gcc -c hello.c
Generará un archivo obj .o.
-S
Solo activa el preprocesamiento y la compilación, es decir, compila el archivo en código ensamblador.
Ejemplo de uso:
gcc -S hello.c
Generará código ensamblador .s, que puedes ver con un editor de texto.
-E
Solo activa el preprocesamiento; esto no genera archivos, necesitas redirigirlo a un archivo de salida.
Ejemplo de uso:
gcc -E hello.c > pianoapan.txt gcc -E hello.c | more
Tómate tu tiempo, un "hello world" también se preprocesa en 800 líneas de código.
-o
Especifica el nombre del objetivo. De forma predeterminada, el archivo compilado por gcc es a.out, que suena mal. Si sientes lo mismo que yo, cámbialo, jeje.
Ejemplo de uso:
gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c
-pipe
Usa tuberías (pipelines) en lugar de archivos temporales en la compilación. Puede haber algunos problemas al usar herramientas de ensamblado no GNU.
gcc -pipe -o hello.exe hello.c
-ansi
Desactiva las características de GNU C incompatibles con ANSI C y activa las características propias de ANSI C (incluyendo la prohibición de palabras clave como asm, inline, typeof, y macros de preprocesamiento como UNIX, vax, etc.).-fno-asm
Esta opción implementa parte de la funcionalidad de la opción ansi; prohíbe usar asm, inline y typeof como palabras clave.
-fno-strict-prototype
Solo afecta a g++. Con esta opción, g++ considera que las funciones sin parámetros no tienen una declaración explícita del número y tipo de parámetros, en lugar de no tener parámetros.
Y gcc, independientemente de si se usa este parámetro, considerará que las funciones sin parámetros son de tipo sin declaración explícita.
-fthis-is-varialble
Es decir, alinearse con el C++ tradicional; se puede usar 'this' como una variable normal.
-fcond-mismatch
Permite que los tipos del segundo y tercer parámetro de la expresión condicional no coincidan; el valor de la expresión será de tipo void.
-funsigned-char 、-fno-signed-char、-fsigned-char 、-fno-unsigned-char
Estos cuatro parámetros configuran el tipo char, decidiendo si se establece como unsigned char (los dos primeros parámetros) o signed char (los dos últimos parámetros).
-include file
Incluir cierto código. En pocas palabras, cuando se compila un archivo y se necesita otro archivo, se puede usar esto para configurarlo. La función equivale a usar en el código:#include<filename>。
Ejemplo de uso:
gcc hello.c -include /root/pianopan.h
-imacros file
Expande las macros del archivo file a los archivos de entrada de gcc/g++; la definición de las macros en sí no aparece en el archivo de entrada.
-Dmacro
Equivale a en lenguaje C:#define macro
-Dmacro=defn
Equivale a en lenguaje C:#define macro=defn
-Umacro
Equivale a en lenguaje C:#undef macro
-undef
Cancela la definición de cualquier macro no estándar.
-Idir
Cuando usas #include "file"..., gcc/g++ buscará primero el archivo de cabecera especificado en el directorio actual. Si no lo encuentra, irá al directorio de cabeceras predeterminado. Si se usa -I para especificar un directorio, buscará primero en el directorio que especificaste y luego en el orden habitual.
Para #include<file>, gcc/g++ buscará en el directorio especificado por -I; si no lo encuentra, buscará en el directorio de cabeceras predeterminado del sistema.
-I-
Es cancelar la función del parámetro anterior, por lo que generalmente se usa después de -Idir.
-idirafter dir
Si la búsqueda falla en el directorio de -I, irá a buscar en este directorio.
-iprefix prefix 、-iwithprefix dir
Generalmente se usan juntos. Cuando falla la búsqueda en el directorio -I, buscará en prefix+dir.
-nostdinc
Hace que el compilador no busque archivos de cabecera en el directorio de cabeceras predeterminado del sistema. Generalmente se usa junto con -I para limitar claramente la ubicación de los archivos de cabecera.
-nostdin C++
Especifica que no se busque en las rutas estándar especificadas por g++, pero sí en otras rutas. Esta opción se usa al crear la biblioteca libg++.
-C
Durante el preprocesamiento, no elimina la información de los comentarios. Generalmente se usa con -E; a veces, al analizar programas, es muy conveniente.
-M
Genera información de dependencias de archivos. Incluye todo el código fuente del que depende el archivo objetivo. Puedes usargcc -M hello.cpara probarlo, es muy sencillo.
-MM
Igual que el anterior, pero ignorará las dependencias causadas por#include<file>dependencias causadas.
-MD
Igual que -M, pero la salida se redirigirá al archivo .d.
-MMD
Igual que -MM, pero la salida se redirigirá al archivo .d.
-Wa,option
Esta opción pasa option al ensamblador; si option contiene comas, se divide en múltiples opciones y luego se pasa al ensamblador.
-Wl.option
Esta opción pasa option al enlazador; si option contiene comas, se divide en múltiples opciones y luego se pasa al enlazador.
-llibrary
Especifica la biblioteca que se usará al compilar.
Ejemplo de uso:
gcc -lcurses hello.c
Compilar el programa usando la biblioteca ncurses.
-Ldir
Especifica la ruta de búsqueda de bibliotecas al compilar. Por ejemplo, si tienes tu propia biblioteca, puedes usarla para especificar el directorio; de lo contrario, el compilador solo buscará en el directorio de bibliotecas estándar. Este dir es el nombre del directorio.
-O0 、-O1 、-O2 、-O3
Los 4 niveles de opciones de optimización del compilador: -O0 significa sin optimización, -O1 es el valor predeterminado, -O3 es el nivel de optimización más alto.
-g
Hace que el compilador genere información de depuración al compilar.
-gstabs
Esta opción genera información de depuración en formato stabs, pero no incluye información de depuración de gdb.
-gstabs+
Esta opción genera información de depuración en formato stabs e incluye información adicional de depuración solo para gdb.
-ggdb
Esta opción generará, en la medida de lo posible, información de depuración utilizable por gdb.
-static
Esta opción prohíbe el uso de bibliotecas dinámicas, por lo que lo compilado suele ser muy grande, pero no necesita bibliotecas de enlace dinámico para ejecutarse.
-share
Esta opción intentará usar bibliotecas dinámicas, por lo que el archivo generado es más pequeño, pero el sistema necesita bibliotecas dinámicas.
-traditional
Intenta hacer que el compilador admita características tradicionales del lenguaje C.
GCC es el compilador de C y C++ de GNU. En realidad, GCC puede compilar tres lenguajes: C, C++ y Object C (una extensión orientada a objetos del lenguaje C). Con el comando gcc se pueden compilar y enlazar simultáneamente programas fuente en C y C++.
Si tienes dos o unos pocos archivos fuente en C, también puedes usar GCC convenientemente para compilar, enlazar y generar un ejecutable. Por ejemplo, supón que tienes dos archivos fuente, main.c y factorial.c, y ahora quieres compilar y generar un programa que calcule el factorial.
Código del archivo factorial.c
Código del archivo main.c
Usando el siguiente comando se puede compilar y generar el ejecutable, y ejecutar el programa:
$ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.
GCC se puede usar para compilar tanto programas en C como en C++. En general, el compilador de C determina si es un programa en C o en C++ según la extensión del archivo fuente. En Linux, la extensión de los archivos fuente en C es .c, mientras que la extensión de los archivos fuente en C++ es .C o .cpp. Sin embargo, el comando gcc solo puede compilar archivos fuente en C++, pero no puede enlazar automáticamente con las bibliotecas que usan los programas en C++. Por lo tanto, normalmente se usa el comando g++ para completar la compilación y el enlace de programas en C++; este programa llamará automáticamente a gcc para realizar la compilación. Supongamos que tenemos un archivo fuente en C++ como el siguiente (hello.c):
Código del archivo hello.c
Entonces se puede invocar el comando g++ de la siguiente manera para compilar, enlazar y generar el ejecutable:
$ g++ -o hello hello.c $ ./hello Hello, world!
Opciones comunes del comando gcc
| Opción | Explicación |
|---|---|
| -ansi | Solo admite la sintaxis C estándar ANSI. Esta opción prohibirá ciertas características de GNU C, por ejemplo, las palabras clave asm o typeof. |
| -c | Solo compilar y generar el archivo objeto. |
| -DMACRO | Definir la macro MACRO con la cadena "1". |
| -DMACRO=DEFN | Definir la macro MACRO con la cadena "DEFN". |
| -E | Solo ejecutar el preprocesador de C. |
| -g | Generar información de depuración. El depurador GNU puede utilizar esta información. |
| -IDIRECTORY | Especificar la ruta de búsqueda adicional de archivos de cabecera DIRECTORY. |
| -LDIRECTORY | Especificar la ruta de búsqueda adicional de bibliotecas DIRECTORY. |
| -lLIBRARY | Buscar la biblioteca especificada LIBRARY al enlazar. |
| -m486 | Optimizar el código para 486. |
| -o FILE | Generar el archivo de salida especificado. Se usa al generar archivos ejecutables. |
| -O0 | No realizar optimización. |
| -O o -O1 | Optimizar el código generado. |
| -O2 | Optimizar aún más. |
| -O3 | Optimizar aún más que -O2, incluyendo funciones inline. |
| -shared | Generar archivo objeto compartido. Normalmente se usa al crear bibliotecas compartidas. |
| -static | Prohibir el uso de enlazado compartido. |
| -UMACRO | Cancelar la definición de la macro MACRO. |
| -w | No generar ningún mensaje de advertencia. |
| -Wall | Generar todos los mensajes de advertencia. |