Lenguaje C para realizar el programa de barra de progreso: el uso de gcc, gdb y herramientas de creación
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
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 .
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 .
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
Puede ver el archivo binario con el comando nm
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
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.
- 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".
- 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
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
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
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.
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.
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
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.
- 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.
Por lo general, usamos una forma más sencilla de compilar un proyecto de un solo archivo
para generar una solución. . El Makefile también proporciona la limpieza del proyecto, como se muestra en la siguiente figura.
Comando de limpieza
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.
Sin embargo, si hay demasiados archivos, adoptaremos el siguiente método