El uso y desarrollo de Linux GCC

¿Por qué compilar el programa?
• Los lenguajes de programación de alto nivel (C, fortran) deben ser compilados por un compilador para generar archivos ejecutables. Los lenguajes de script (matlab, shell) solo se pueden ejecutar mediante el análisis de comandos a través del intérprete de comandos de script.


1. Uso de GCC

• GCC (compilador C y C ++ del proyecto GNU)
• GCC se usa para compilar programas C o C ++, y los programas Fortran se compilan con el compilador gfortran o ifort.
• El programa C / C ++ tiene cuatro pasos desde el inicio de la codificación hasta la generación de archivos binarios ejecutables: 1. Preprocesamiento, 2. Compilación, 3. Ensamblaje, 4. Vinculación
• Al establecer los parámetros de GCC, los cuatro pasos anteriores se pueden completar en pasos. O configure los parámetros para completar todo el paso a la vez.
• Opciones comunes de GCC

Opciones sentido
-o file Guarde el resultado procesado por GCC como un archivo. Este archivo de resultados puede ser un archivo preprocesado, una consulta de ensamblaje, un archivo de destino o el archivo ejecutable final. Suponiendo que el archivo de origen que se va a procesar es source.suffix, si se omite esta opción, el nombre predeterminado del archivo ejecutable generado es a.out; el nombre predeterminado del archivo de destino source.o; el nombre predeterminado del archivo de ensamblaje source.s; el archivo preprocesado generado se envía al dispositivo de salida estándar
-c Compile únicamente los archivos de origen y no los vincule para generar archivos ejecutables. Puede utilizar esta opción cuando esté solucionando problemas de un archivo de origen o cuando solo necesite generar un archivo de destino
-g[gdb] Agregue información de depuración al archivo ejecutable para facilitar la depuración del programa. Si usa las opciones entre paréntesis, significa agregar información de depuración extendida de gdb, que es conveniente para depurar con gdb
-O [0、1、2、3] Utilice la optimización para el código generado. La parte entre paréntesis es el nivel de optimización. El valor predeterminado es la optimización de nivel 2 y 0 significa que no hay optimización. Tenga en cuenta que el uso de optimizaciones más avanzadas no necesariamente da como resultado un código más eficiente
-Dname [=definition] Defina la macro denominada nombre como definición. Si la parte entre paréntesis es la predeterminada, la macro se define como 1
-Idir Agregue un directorio adicional para buscar archivos de encabezado al compilar el directorio de programa de origen, es decir, incluir agrega un directorio adicional para buscar
-Ldir Agregue un directorio adicional para buscar archivos al compilar archivos de origen-dir
-llibrary Agregue una biblioteca adicional al compilar el archivo de enlace, el nombre de la biblioteca es biblioteca.
-w Suprime todas las advertencias
-Wwarning Se permite generar avisos del tipo aviso. El aviso puede tener muchos valores como principal y no utilizado. El más utilizado es todos, lo que significa que se generan todos los avisos. Si el valor de la advertencia es error, su significado es tratar todas las advertencias como errores, es decir, dejar de compilar cuando ocurre una advertencia.

El formato de uso básico de GCC:
gcc [选项] <文件名>

mando sentido
gcc -E hello.c -o hello.i Genera archivos preprocesadoshello.i
gcc -S hello.c -o hello.s Generar archivos de ensamblajehello.s
gcc -c hello.c -o hello.o Generar archivo de objetohello.o
gcc hello.c -o hello Generar archivo ejecutablehello

¡Preste atención al caso de los parámetros! !

2. GCC desarrolla un programa de lenguaje C

1. Situación del programa en lenguaje C de un solo archivo
• Use el comando gcc hello.c –o hellogenera un archivo ejecutable el
comando Hello • use ./hello ejecuta el programa. Tenga en cuenta que el requisito previo para el correcto funcionamiento del programa es que el programa fuente no tenga errores.
2. Programa en lenguaje C con varios archivos
• La estructura del directorio de varios archivos es la siguiente:
main_function.cy summation.cen el directorio actual
summation.hEn un directorio actual includebajo
el compilador de lenguaje c en ejecución, varios archivos:

gcc ‐c main_function.c ‐Iinclude ‐o main_function.o
gcc ‐c summation.c ‐Iinclude ‐o summation.o
gcc main_function.o summation.o ‐o main_function
./main_function

También puede pegar los códigos anteriores en un .shscript y ejecutar el script para compilar y ejecutar el lenguaje C de varios archivos.


• La gestión de scripts de shell es una forma de gestionar la compilación y el funcionamiento de varios programas C. Sin embargo, si hay demasiados archivos C, ¿cómo gestionamos la compilación del programa?
• Linux nos proporciona la herramienta make para compilar el programa. Sin embargo, la premisa es que necesitamos escribir el Makefile de antemano.
• ¿Qué es un archivo MAKE? Un archivo MAKE es
un conjunto de reglas para la compilación y vinculación de programas: qué archivos deben compilarse primero, qué archivos deben recompilarse e incluso ejecutar comandos del sistema operativo. La ventaja es la "compilación automática". Una vez que se escribe el archivo MAKE, solo se necesita una marca y todo el proyecto se puede compilar automáticamente, lo que mejora en gran medida la eficiencia del desarrollo de software.


Reglas de escritura de archivos Makefile:
• Destino: lista de dependencias
• Comando (sangría de tabulación)

  • El destino puede ser un archivo de destino, un archivo ejecutable o una etiqueta (Etiqueta)
  • La lista de dependencias son los archivos u objetivos necesarios para generar ese objetivo.
  • La sangría de tabulación es la distancia que el cursor se mueve hacia la derecha desde el extremo izquierdo del texto al presionar la tecla de tabulación. Esta sangría es obligatoria y única, y no puede usar la barra espaciadora para moverse la misma distancia.
  • El comando es el comando que make necesita ejecutarse. (Como cualquier comando de shell)

Esta es una dependencia de archivo, es decir, el destino depende de los archivos de la lista La
regla de generación de destino se define en el comando. Si uno o más archivos de la lista de dependencias son más nuevos que el archivo de destino, se ejecutará la parte del comando.
Esta es la regla de ejecución del archivo MAKE, y también es el contenido principal del archivo MAKE.

Bien, intentemos escribir el .shscript anterior en un archivo MAKE:

main_function:main_function.o summation.o
	gcc main_function.o summation.o -o main_function
main_function.o:main_function.c ./include/summation.h
	gcc -c main_function.c -I./include -o main_function.o
summation.0:summation.c ./include/summation.h
	gcc -c summation.c -I./include -o summation.o
clean:
	rm -rf *.o

Dependencias de archivo:
1. El archivo ejecutable main_funciton depende de los archivos de destino main_function.oy summation.o
2. El archivo de destino main_function.o depende del archivo fuente main_function.cy del archivo de encabezado summation.h
3. El archivo de destino suma .o depende de En el archivo fuente summation.cy del archivo de encabezado summation.h
4. El objetivo limpio es un pseudo objetivo, similar a la etiqueta utilizada en la declaración goto en Fortran.
Se debe prestar especial atención a gcc, ¡el espacio antes del comando rm es una posición de tabulación!


Como puede ver en lo anterior, el archivo o ha aparecido muchas veces, y su nombre de archivo también es muy largo, lo que es más difícil de representar, por lo que podemos usar una variable para reemplazar el nombre del archivo o. P.ej:

OBJ=main_function.o \ #定义变量OBJ表示o文件,\表示换行符
  summation.o
main_function:$(OBJ) 
	gcc $(OBJ) -o main_function
main_function.o:main_function.c ./include/summation.h
	gcc -c main_function.c -I./include -o main_function.o
summation.0:summation.c ./include/summation.h
	gcc -c summation.c -I./include -o summation.o
clean:
	rm -rf *.o

Nombrar el archivo MAKE
• Al ingresar el comando make sin parámetros en la terminal, buscará
GNUmakefile, makefile, Makefile en el directorio actual, y luego compilará y vinculará para generar un archivo ejecutable.
• Cuando el archivo make tiene otros nombres, como makefile1
. Ingrese el comando make con parámetros:make ‐f makefile1

Biblioteca estática
• Cuando la biblioteca estática está vinculada durante la fase de vinculación, el archivo ejecutable generado no se verá afectado por la biblioteca. Elimine el archivo de la biblioteca y el programa aún se puede ejecutar.

ar ‐r libhello.a hello.o

• Convención de nomenclatura de bibliotecas estáticas libXXX.a
gcc ‐c hello.cpara generar archivos de objeto hello.o
ar ‐r libhello.a hello.opara crear un archivo de enlace estático archivos libhello.a
gcc ‐o test test.c ‐L. –lhellocompilados y vinculados probar
./testla implementación de las
bibliotecas de eliminación de archivos ejecutables libhello.adespués de ./testrealizar

Biblioteca dinámica
• La biblioteca dinámica está vinculada cuando el programa se está ejecutando. Elimine la biblioteca de vínculos dinámicos y el programa que se ha compilado y vinculado no podrá ejecutarse.
gcc ‐shared hello.c ‐o libhello.so
• La biblioteca dinámica se crea directamente desde el archivo fuente
• La biblioteca dinámica se nombra por convención libXXX.so
• El programa no se puede ejecutar si se elimina la biblioteca dinámica

3. Depuración del programa

La depuración del programa se divide en depuración estática y depuración dinámica
• La depuración estática implica errores gramaticales en el programa fuente en el momento de la compilación
• La depuración dinámica implica errores causados ​​por errores en los algoritmos o procesos del programa cuando el programa se está ejecutando, como un bucle infinito,
si el El archivo ejecutable se generó correctamente, puede usar gdb para la depuración dinámica:

gdb ./newtest
l        #list 显示源代码
break 4  #第4行设置断点
r        #run  运行源代码,将在有break 的地方停下来
n        #next 执行到下一行
p var    #打印变量var的值
Ctrl+z/c #退出gdb,修改c文件

4. Ejemplos

Rápido de usar

gcc hello.c -o hello     #c程序
g++ hello.cpp -o hello   #c++程序

A continuación se proporciona un ejemplo de compilación y ejecución de varios archivos de gcc:
Estructura de archivos: hay dos archivos c main.c、summation.cen el directorio actual :, el directorio actual tiene un subdirectorio llamado includey hay un archivo h en él:summation.h

1. Contenido del archivo

El contenido de cada archivo es el siguiente:
C Principal

#include "stdio.h"
#include "summation.h"

int main()
{
    
    
	double a=1.0;
	double b=2.0;
	double c;
	c=summation(a,b);
	printf("a=%5.1f, b=%5.1f, a+b=%5.1f\n",a,b,c);
}

suma.c

#include "summation.h"
double summation(double a, double b)
{
    
    
	double c;
	c=a+b;
	return c;
}

sumatoria.h

double summation(double a, double b);

2. Depuración y ejecución

main.sh
Pasos para crear y ejecutar main.sh:

vi main.sh
chmod +x main.sh
./main.sh

El contenido de main.sh:

#!/bin/bash
gcc -c main.c -Iinclude -o main.o
gcc -c summation.c -Iinclude -o summation.o
gcc main.o summation.o -o main
./main

Lo anterior es para obtener un archivo .sh, también puede copiar y pegar el contenido del archivo .sh anterior línea por línea en el shell para ejecutarlo.
makefile

main:main.o summation.o
	gcc main.o summation.o -o main
main.o:main.c ./include/summation.h
	gcc -c main.c -I./include -o main.o
summation.o:summation.c ./include/summation.h
	gcc -c summation.c -I./include -o summation.o
clean:
	rm -rf *.o

Pasos de operación:

make  #编译运行,直接出结果
make clean  #删除所有o文件

Makefile de versión variable perezosa

mc=main.c
mo=mian.o 
sc=summation.c
so=summation.o 
sh=summation.h
shp=./include/$(sh)
main:$(mo) $(so)
	gcc $(mo) $(so) -o main
$(mo):$(mc) $(shp)
	gcc -c $(mc) -I./include -o $(mo)
$(so):$(sc) $(shp)
	gcc -c $(sc) -I./include -o $(so)
clean:
	rm -rf *.o

Supongo que te gusta

Origin blog.csdn.net/Gou_Hailong/article/details/109745963
Recomendado
Clasificación