Herramientas de desarrollo del lenguaje C de Linux: aprenda a usar las herramientas gcc, gdb y make / Makefile a través del pequeño programa de la barra de progreso

1. Implementación del programa de barra de progreso en Linux

El código para implementar la barra de progreso es muy simple, el código es el siguiente

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define NUM 101

int main()
{
    
    
  int i = 0;
  char bar[NUM]; //用于存放进度条数组
  memset(bar, 0, sizeof(bar));
  char label[] = "|/-\\";

  for(i = 0; i < 100; ++i)
  {
    
    
    bar[i] = '#';
    printf("[%-100s][%3d%%][%c]\r", bar, i+1, label[i%4]);
    fflush(stdout);
    usleep(10000);
  }
  printf("\n");
  return 0;
}

El resultado final
Inserte la descripción de la imagen aquí
Si desea compilar el código anterior, debe dominar las herramientas de desarrollo básicas en Linux

Dos, compilador de Linux-gcc

Un programa en lenguaje C necesita seguir cuatro pasos: preprocesamiento, compilación, ensamblaje y vinculación
¿Cómo completa gcc estos cuatro pasos? El formato de gcc en Linux es el siguiente:

gcc [opciones] archivo a compilar [opciones] [archivo objeto]

2.1 Preprocesamiento (para reemplazo de macros)

  • La función de pre-procesamiento incluye principalmente la definición de macro, la inclusión de archivos, la compilación condicional, de-comentario y así sucesivamente .
  • Las instrucciones de preprocesamiento son líneas de código que comienzan con el signo #.

Tome nuestro código de barras de progreso, por ejemplo

gcc -E proc.c -o proc.i

  • Opción"-MI", la función de esta opción es hacer que gcc detenga el proceso de compilación una vez finalizado el preprocesamiento .
  • Opción"-Los"Se refiere al archivo de destino, y el archivo" .i "es el programa original de C que ha sido preprocesado .

Inserte la descripción de la imagen aquí

2.2 Compilar (generar ensamblado)

En esta etapa, gcc debe primeroVerifique la estandarización del código, si hay errores gramaticales, etc.Para determinar el trabajo real a realizar en el código, enDespués de comprobar que es correcto, gcc traduce el código al lenguaje ensamblador.

Regala una castaña:

gcc -S proc.i -o proc.s

  • Opción"-S", la función de esta opción es detener gcc para generar lenguaje ensamblador después de la compilación .
  • Opción"-Los"Se refiere al archivo de destino y el archivo" .s "es el programa C original que se ha compilado .

Inserte la descripción de la imagen aquí

2.3 Ensamblaje (generar código identificable de la máquina)

La etapa de ensamblaje consiste en convertir el archivo ".s" generado en la etapa de compilación en un archivo objeto.

Regalar una castaña

gcc -c proc.s -o proc.o

  • Option == "-c" == puede ver que el código ensamblador se ha convertido en un código de objeto binario de ".o", y puede ver que el archivo binario mostrará caracteres confusos si se abre de manera normal

Inserte la descripción de la imagen aquí
Puede ver el archivo binario con el comando nm
Inserte la descripción de la imagen aquí

2.4 Enlace (generar archivo ejecutable o archivo de biblioteca)

Después de una compilación exitosa, ingresa a la fase de vinculación. Podemos generar el archivo ejecutable que queramos

por ejemplo

gcc proc.o -o proc

Inserte la descripción de la imagen aquí

2.5 Bibliotecas estáticas y dinámicas

  • En nuestro programa C, yLa implementación de la función de "printf" no está definida, Y en el "stdio.h" incluido en la precompilación, solo está la declaración de la función, pero la implementación de la función no está definida Entonces, ¿dónde está implementada la función "printf"?

la respuesta es:

El sistema implementa estas funciones en un archivo de biblioteca llamado libc.so.6, Cuando no hay una designación especial, gcc buscará en la ruta de búsqueda predeterminada del sistema "/ usr / lib", que esEnlace a la función de biblioteca libc.so.6, Para que se pueda implementar la función "printf", y esto esEl papel de los enlaces

Las bibliotecas de funciones se dividen generalmente en bibliotecas estáticas y bibliotecas dinámicas.

  1. Biblioteca estática significa que al compilar y vincular, todo el código del archivo de biblioteca se agrega al archivo ejecutable , por lo que el archivo generado es relativamente grande , pero el archivo de biblioteca ya no es necesario en tiempo de ejecución . El nombre del sufijo es generalmente ".a".
  2. A diferencia de la biblioteca dinámica, el código del archivo de biblioteca no se agrega al archivo ejecutable al compilar y vincular, pero el archivo de vínculo de tiempo de ejecución carga la biblioteca cuando se ejecuta el programa , lo que puede ahorrar gastos generales del sistema . El sufijo general de la biblioteca dinámica es ".so" Como se mencionó anteriormente, libc.so.6 es la biblioteca dinámica. gcc usa bibliotecas dinámicas de forma predeterminada al compilar. Una vez completado el enlace, gcc puede generar un archivo ejecutable,

2.6 opciones de gcc

Si está familiarizado con las tres primeras opciones, generalmente usamos el archivo .c para generar directamente el archivo ejecutable, el efecto es el siguiente

Inserte la descripción de la imagen aquí
Otras opciones de gcc son las siguientes

-MI Solo active el preprocesamiento, esto no genera un archivo, debe redirigirlo a un archivo de salida
-S Compilar en lenguaje ensamblador sin ensamblar ni vincular
-C Compilar según el código de destino
-Los Archivo de salida a archivo
-estático Esta opción utiliza enlaces estáticos para los archivos generados.
-gramoGenere información de depuración. El depurador GNU puede utilizar esta información.
-shared Esta opción intentará usar la biblioteca dinámica, por lo que el archivo generado es relativamente pequeño, pero el sistema necesita la biblioteca dinámica.
-O0
-O1
-O2 -O3
Hay 4 niveles de opciones de optimización para el compilador, -O0 significa sin optimización, -O1 significa El valor predeterminado, -O3 es el nivel de optimización más alto
-w no genera ningún mensaje de advertencia.
-Wall genera todos los mensajes de advertencia.

Tres, depurador de Linux-gdb

Hay dos formas de liberar el programa, el modo de depuración y el modo de liberación
. El programa binario de Linux gcc / g ++, el predeterminado es el modo de liberación.

3.1 programa de depuración gdb

Inserte la descripción de la imagen aquí
Para usar el depurador de gdb , debe generar binarios en el código fuente cuando se combina con la opción -g
para castañas

gcc proc.c -o proc-debug -g
Inserte la descripción de la imagen aquí

gdb proc-debug #开始调试程序

  • list / l número de línea: muestra el código fuente de binFile, luego ve a la siguiente posición desde la última vez, 10 líneas cada vez.
  • list / l nombre de función: muestra el código fuente de una función.
  • r o ejecutar: Ejecuta el programa.
  • quit / q: Salir de gdb.

Inserte la descripción de la imagen aquí

3.2 gdb usa puntos de interrupción

break (b) Número de línea: establece un punto de interrupción en un
salto de línea . nombre de la función: establece un punto de interrupción al comienzo de una función
.
terminar: ejecutar hasta que vuelva la función actual, y luego detenerse y esperar el comando
print (p) (p)( p ) : imprime el valor de la expresión, a través de la expresión puedes modificar el valor de la variable o llamar a la función
p variable: imprime el valor de la variable.

Inserte la descripción de la imagen aquí

eliminar puntos de interrupción: eliminar todos los puntos de interrupción
eliminar puntos de interrupción n: eliminar el punto de interrupción con número de secuencia n
deshabilitar puntos de interrupción: deshabilitar puntos de interrupción
habilitar puntos de interrupción: habilitar
información de puntos de interrupción (o i) puntos de interrupción: ver qué puntos de interrupción están configurados actualmente
mostrar Nombre de variable: vista de seguimiento Una variable, su el valor se muestra cada vez que se detiene.
undisplay: cancela el seguimiento de las variables configuradas previamente

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Cuatro, creación de herramientas de compilación automatizada de proyectos Linux / Makefile

¿Escribirás un archivo MAKE? Explica desde un lado si una persona tiene la capacidad de completar proyectos a gran escala. Los archivos de origen de un proyecto no se cuentan. Se colocan en varios directorios según el tipo, la función y el módulo. Makefile define una serie de reglas para especificar qué archivos deben compilarse primero, qué archivos deben compilarse más tarde, qué archivos deben recompilarse e incluso funciones más complejas. El beneficio del archivo MAKE es la "compilación automática". Una vez escrito , sólo se necesita uno. El comando make, todo el proyecto se compila completamente automáticamente, lo que mejora en gran medida la eficiencia del desarrollo de software. make es una herramienta de comando que explica las instrucciones en el archivo make.En general, la mayoría de los IDE tienen este comando, como make en Delphi, nmake en Visual C ++ y make en GNU en Linux. Se puede ver que los archivos MAKE se han convertido en un método de compilación en ingeniería.
make es un comando, makefile es un archivo y los dos se utilizan juntos para completar la construcción automatizada del proyecto

4.1 Makefile de archivo único

Primero, compile el Makefile. Si desea generar un archivo ejecutable, el proceso completo debe pasar por cuatro pasos: preprocesamiento, compilación, ensamblaje y vinculación, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí

  • Dependencia El
    proc de archivo anterior, depende de proc.o
    proc.o, depende de proc.s
    proc.s, depende de proc.i
    proc.i, depende de proc.c
  • El método de dependencia
    gcc hello. * -Option hello. * Es la dependencia correspondiente

Una vez que se completa la compilación, puede usar el comando make para completar la construcción del programa de un solo archivo y usar make clean para completar la limpieza del proyecto.
Inserte la descripción de la imagen aquí
Por lo general, usamos una forma más sencilla de compilar un proyecto de un solo archivo
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
para generar una solución. . El Makefile también proporciona la limpieza del proyecto, como se muestra en la siguiente figura.
Inserte la descripción de la imagen aquí

Comando de limpieza

Inserte la descripción de la imagen aquí

4.2 Makefile de varios archivos

Primero creamos un proc.h de múltiples archivos

#pragma once
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define NUM 101

extern void proc();

proc.h

#include "proc.h"

void proc()
{
    
    
  int i = 0;
  char bar[NUM]; //用于存放进度条数组
  memset(bar, 0, sizeof(bar));
  char label[] = "|/-\\";

  for(i = 0; i < 100; ++i)
  {
    
    
    bar[i] = '#';
    printf("[%-100s][%3d%%][%c]\r", bar, i+1, label[i%4]);
    fflush(stdout);
    usleep(100000);
  }
  printf("\n");
}

C Principal

#include "proc.h"

int main()
{
    
    
  proc();
  return 0;
}

Queremos construir un proyecto de varios archivos como se muestra a continuación, que se puede escribir uno por uno.
Inserte la descripción de la imagen aquí
Sin embargo, si hay demasiados archivos, adoptaremos el siguiente método
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_40076022/article/details/113403676
Recomendado
Clasificación