¿Cómo transfieren parámetros los programas fuente en ensamblador y los programas fuente en C?
llo.out, si se compila correctamente, aparecerá un archivo hello.out en el directorio raíz y luego /hello.out, podrá ver el resultado.
Específico Ver el uso de GCC
1. Historia de gcc
GCC fue originalmente un compilador de C escrito por Richard Stallman hace más de diez años, es decir, el compilador GNU C, y luego desarrolló Supports Ada. C, Java, Objective C, Pascal, COBOL y el lenguaje Mercury que admite la programación lógica. Más tarde, su nombre original en inglés se convirtió en: Colección GNU Compiler ([1]). Además, GCC proporciona varias funciones para varias plataformas de hardware. soporte completo.
Generalmente, las funciones de compilación de GCC incluyen gcc (compilador de C), g (compilador de C). En el proceso de compilación, hay cuatro pasos en un solo paso.
1. Preprocesamiento, generación de archivos i, los archivos C se compilan en archivos .i y los archivos C se compilan en archivos .ii. Todos son archivos de resultados de preprocesamiento del programa fuente. Por ejemplo:
************************************
// test.c
#include "stdio.h"
#define MAX 9
int main()
{
int a;
a=MAX;
printf("Hola mundo");
}
**********************************
Utilice la prueba cpp test.c. i para obtener el archivo de preprocesamiento test.i. Al mirar este archivo, podemos ver que el archivo de inclusión que introdujimos se introdujo y procesó, y la parte de definición se incorporó por completo.
2. Convierta el archivo de preprocesamiento a lenguaje ensamblador y genere un archivo .s. Este paso se completa usando egcs (este precompilador no se ve en el paquete estándar mingw, por lo que la prueba no es exitosa y se continuará probando)
3. Ensamble en un archivo de destino y genere un .o. archivo y utilizar como para completar.
4. Conecte el archivo de destino, genere un programa ejecutable y use ld para completarlo (continuaremos estudiando el proceso de compilación de ld más adelante).
2. explicación
-x nombre de archivo de idioma
Establezca el idioma utilizado por el archivo, de modo que el nombre del sufijo del programa fuente no sea válido y sea válido para múltiples archivos compilados seguidos de gcc. De esta manera, si hay archivos .c y .cpp, habrá problemas al vincular. Para resolver este problema, se utiliza el siguiente parámetro -x none filename, que se presenta a continuación. Porque los archivos .c y .cpp se procesan de manera diferente durante el proceso de preprocesamiento. Los parámetros que se pueden utilizar son: 'c', 'objective-c', 'c-header', 'c', 'cpp-output', 'assembler', 'assembler-with-cpp' Al compilar, si. cualquiera Para un archivo test.tmp escrito en lenguaje C, al compilar con gcc, use gcc -x c test.tmp para permitir que gcc compile test.tmp de la misma manera que el lenguaje C.
-x none nombre de archivo
Desactive la opción anterior para permitir que gcc identifique automáticamente el tipo de archivo según el sufijo del nombre del archivo.
Por ejemplo, compile de la siguiente manera: gcc -x c test.tmp -x none test2.c De esta manera puede elegir libremente el método de compilación
-c
Activar solo el preprocesamiento, compilación y ensamblaje. Es decir, convertir el programa en un archivo obj. Por ejemplo, gcc -c test.c generará un archivo test.o. Por supuesto, este es solo un archivo de destino. Todos los archivos .o deben conectarse a través del conector ld para generar un archivo ejecutable.
-S
Solo activa el preprocesamiento y la compilación, y compila archivos en código ensamblador. Es equivalente a realizar una operación egcs en el programa fuente para generar un archivo .s. Se pueden ver los resultados del archivo de ensamblaje resultante. Esto es muy útil para programadores que estudian lenguaje ensamblador.
-E
Solo activa el preprocesamiento. Esto preprocesará el archivo y reemplazará todos los archivos de inclusión importados y definirá las cantidades, como dijimos al principio. El primer paso en la compilación de gcc es usar. el comando cpp para preprocesar el archivo de lenguaje del programa. Sin embargo, este paso no genera un archivo de resultados. Si necesita generar un archivo de resultados y guardarlo, debe utilizar la redirección de salida en el sistema.
-o
Personalice el nombre del destino. De forma predeterminada, el resultado del nombre de archivo gcc en plataformas Unix y Linux es un archivo llamado a.out. El resultado de la compilación de gcc es a.exe. Si usamos gcc -o hello.exe test.c, se generará el programa ejecutable hello.exe. Esto no se limita necesariamente a la generación de programas ejecutables en el último paso. Por ejemplo, el programa ensamblador generado con -S mencionado anteriormente también se puede generar con el parámetro -o, como gcc -o hello.asm -S test. c entonces hello.asm Es el resultado de test.c después del preprocesamiento y compilación.
-pipe
Utilice canalizaciones para reemplazar archivos temporales durante la compilación, porque todo el proceso de compilación tiene varios pasos diferentes y cada paso utiliza la salida del paso anterior como entrada. , esto implica la cuestión de la transferencia de datos. En ausencia del parámetro -pipe, se transfiere en forma de archivo temporal. En este caso, se utiliza una tubería para transferir datos intermedios. Por supuesto, en algunos sistemas, el ensamblaje no puede leer los datos de la tubería, por lo que este parámetro no funcionará correctamente.
-ansi
Desactiva las características incompatibles de gnu c y ansi c, y activa las características propietarias de ansi c. En este caso, el procesador definirá una macro __STRICT_ANSI__, en. En algunos archivos de encabezado, se prestará atención a si la macro se ha declarado para evitar la introducción de ciertas funciones. Este elemento se puede entender mejor haciendo referencia a la diferencia entre ansi c y gnu c.
-fno-asm
Esta opción es parte de la función de opción ansi. Está prohibido utilizar asm, inline y typeof como palabras clave.
-fno-strict-prototype
Esta opción sólo afecta a g. Este parámetro permite al compilador tratar todas las funciones sin parámetros como funciones sin un número y tipo explícito de parámetros, en lugar de sin parámetros. Para gcc, las funciones sin parámetros se considerarán tipos sin descripción explícita.
-fthis-is-variable
Este parámetro sólo es válido para programas en C. Permite utilizar esta como variable general y permite asignar valores a esta.
-fcond -mismatch
Permite que el segundo y tercer tipo de parámetro de la expresión condicional no coincidan. El valor de la expresión es de tipo nulo.
-funsigned-. char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
Estas cuatro son configuraciones para char en el momento de la compilación, deciden respectivamente establecer char en char sin firmar o char firmado.
-include filename
Agregue la ubicación del archivo de encabezado para que #include se pueda usar sin problemas. en el programa, para que pueda compilarse Al compilar: gcc test.c
-include ./include/test.h, compila.
-imacros filename
Expande la macro en filename al archivo de entrada gcc. La definición de la macro en sí no aparecerá en el archivo de entrada. Esto significa que al compilar un determinado archivo test.c, si no se utiliza este parámetro, las macros declaradas en él se descartarán después de generar el archivo de destino. Después de usar este parámetro, estas macros se descartarán para la compilación posterior del archivo. .
-Dmacro
Equivalente a la macro #define, el contenido de la macro es la cadena '1'. Por ejemplo, usar gcc -o test.exe test.c -DDEBUG durante la compilación equivale a definir la macro DEBUG en test.c, siendo el valor la cadena '1'. Se puede utilizar el siguiente programa para realizar la prueba:
************************************ **
//test.c
#include "stdio.h"
int main()
{
printf ("Hola mundo");
#ifdef DEBUG
printf("Hola");
#endif
} p>
************************************
Si usa gcc - o test.exe se compila test.c y el resultado de simplemente ejecutarlo es:
Hola mundo
Si se compila con gcc -o test.exe test.c -DDEBUG, el resultado de la ejecución es:
Hola mundo
hola
Por lo tanto, el siguiente método de compilación puede ser equivalente a definir la macro DEBUG en prueba.c.
-Dmacro=define
La función es la misma que la anterior, pero estableciendo el valor de la macro a definir.
-Umacro
Es equivalente a darle al programa La macro definida en is undefine una vez Es decir: #undef macro
-undef
Cancela la definición de cualquier amigo no estándar
.-Idir p>
Cuando #include, primero busque el archivo de encabezado en la ubicación especificada por este parámetro. Si no lo encuentra, busque el archivo de encabezado en el directorio predeterminado
. -I-
Cancelar la función de -Idir indica que los programas compilados futuros no buscarán archivos de encabezado en el directorio especificado por -Idir.
-idirafter dir
Después de que la búsqueda falla en el directorio -I, busque el archivo de encabezado en este directorio. Este parámetro es más efectivo para establecer la prioridad del archivo de encabezado. buscar ayuda.
-iprefix prefix
-iwithprefix dir
Estos dos parámetros se usan juntos Cuando la búsqueda del directorio -I falla, busque el encabezado en el directorio de. prefijo.
-nostdinc
El compilador ya no busca archivos de encabezado en el directorio de archivos de encabezado predeterminado del sistema. De esta manera, se puede determinar con precisión el origen del archivo de encabezado. Debe usarse con precaución. Si no se comprende bien el compilador, es fácil causar fallas en la compilación.
-nostdinc C
No está en g Busque archivos de encabezado en la ruta estándar, pero continúe buscando en otras rutas. Se utiliza al crear lib.
-C
Para analizar eficazmente el programa, la información de anotación no se elimina durante el preprocesamiento. Cuando se usa con -E, hay un proceso que utiliza el programa de análisis.
-M
Genera la información asociada del archivo, para que puedas saber de qué archivos de encabezado depende que estén asociados con el archivo de código fuente.
-MM
Igual que el anterior, pero ignora las dependencias causadas por #include
-MD
Igual que -M, pero genera Importarlo a un archivo .d, como gcc -MD test.c. Las dependencias que acaba de generar se almacenan en el archivo test.d.
-MMD
Igual que -MM, pero salida a un archivo .d, como gcc -MMD test.c. Las dependencias recién generadas se almacenan en el archivo test.d. . Ignore la relación #include
-Wa, opción
Este parámetro pasa la opción al ensamblador. Si hay una coma en la opción, la opción se dividirá en varios elementos y. pasado al ensamblador.
-Wl, opción
Este parámetro pasa la opción al programa de conexión. Si hay una coma en la opción, la opción se dividirá en varios elementos y se pasará a la conexión. programa.
-llibrary
Se utiliza para especificar la biblioteca utilizada durante la compilación. Por ejemplo, gcc -lgtk tset.c significa que el programa usa la biblioteca gtk para la compilación. Cabe señalar que la biblioteca gcc generalmente El archivo de la biblioteca lleva el nombre de libname.a. Cuando use el parámetro -l para agregar el archivo de la biblioteca, use -lname para importarlo directamente y se omite la biblioteca anterior. Esto necesita atención.
-Ldir
Establezca la ruta para buscar archivos de biblioteca al compilar. De lo contrario, el compilador solo buscará bibliotecas en la ruta de biblioteca estándar.
-00
-01
-02
-03
Opciones de optimización del compilador, - 00 significa sin optimización, -01 es el valor predeterminado y -03 es el más alto.
-g
Generar información de depuración durante la compilación
-gstabs
Reclamar información de depuración en formato stabs, pero no incluir información de depuración para bgd.
-gstabs
Reportar información de depuración en formato stabs, incluida información de depuración de gdb.
-ggdb
Este parámetro generará la información de depuración de gdb
-static
Este parámetro prohibirá el uso de bibliotecas dinámicas , por lo que los programas solo pueden vincularse a bibliotecas estáticas.
-share
Este parámetro hará que el programa utilice bibliotecas dinámicas tanto como sea posible
-traditional
Intentando hacer que el compilador admite las características tradicionales del lenguaje C.
3. Resumen
gcc tiene muchos más parámetros que los escritos anteriormente, pero con los parámetros anteriores ya podemos dominar la mayor parte de la compilación de gcc. Soy más competente. Para obtener más información sobre los parámetros, puede consultar el manual de GCC. Ahora hay un manual traducido al chino. La dirección se incluye en las referencias a continuación.