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

int factorial (int n) {   if (n <= 1)    return 1;   else    return factorial (n - 1) * n; }

Código del archivo main.c

#include <stdio.h> #include <unistd.h> int factorial (int n); int main (int argc, char **argv) {   int n;   if (argc < 2)   {     printf ("Usage: %s n\n", argv [0]);     return -1;   }   else   {    n = atoi (argv[1]);    printf ("Factorial of %d is %d.\n", n, factorial (n));    }   return 0; }

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

#include <iostream> void main (void) {   cout << "Hello, world!" << endl; }

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ónExplicación
-ansiSolo 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.
-DMACRODefinir la macro MACRO con la cadena "1".
-DMACRO=DEFNDefinir 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.
-LDIRECTORYEspecificar 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 -O1Optimizar 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.
-UMACROCancelar la definición de la macro MACRO.
-w No generar ningún mensaje de advertencia.
-Wall Generar todos los mensajes de advertencia.