72 lines
3.7 KiB
Markdown
72 lines
3.7 KiB
Markdown
# Chuleta de comandos
|
|
|
|
Comandos que hemos usado, agrupados por tarea. Los flags del proyecto son
|
|
`-std=c17 -Wall -Wextra -Wpedantic -g`.
|
|
|
|
## Compilar paso a paso
|
|
|
|
| Comando | Qué hace |
|
|
|---|---|
|
|
| `gcc -E -Iinclude src/escpos.c -o build/escpos.i` | Solo preprocesa. Genera el `.i`: C con los `.h` pegados. |
|
|
| `gcc -S ...` | Para después de compilar. Genera el `.s` (ensamblador). |
|
|
| `gcc <flags> -Iinclude -c src/escpos.c -o build/escpos.o` | Compila hasta el `.o` (fichero objeto), sin enlazar. |
|
|
| `gcc <flags> -c build/escpos.i -o build/escpos.o` | Compila partiendo de un `.i`. No hace falta `-I`. |
|
|
| `gcc <flags> -Iinclude -save-temps -c src/escpos.c` | Cadena completa, conservando `.i`, `.s` y `.o`. |
|
|
| `gcc build/hello.o build/escpos.o -o build/hello` | Enlaza los `.o` en un ejecutable. |
|
|
| `./build/hello` | Ejecuta un programa de la carpeta actual. |
|
|
|
|
Si juntas dos flags de parada (`-E -S`), gana la que para antes.
|
|
|
|
## Inspeccionar ficheros
|
|
|
|
| Comando | Qué hace |
|
|
|---|---|
|
|
| `nm build/hello.o` | Lista símbolos: `T` definido y visible, `t` definido y `static`, `U` usado pero definido en otro sitio. |
|
|
| `wc -l fichero` | Cuenta líneas (por ejemplo, para comparar `.c` y `.i`). |
|
|
| `ls -l build/` | Muestra la fecha de modificación: sirve para ver qué `.o` está obsoleto. |
|
|
| `file fichero` | Dice qué es: ELF (Linux), COFF o PE (Windows)... |
|
|
| `strings fichero.o` | Muestra las cadenas legibles que hay dentro de un binario. |
|
|
| `objdump -d fichero.o` | Desensambla el código máquina. |
|
|
| `objdump --dwarf=info fichero.o` | Muestra la información de depuración que añade `-g`. |
|
|
| `xxd fichero.bin` | Volcado hexadecimal (para revisar los bytes ESC/POS). |
|
|
| `tail -c 5 fichero \| xxd` | Muestra los últimos bytes: sirve para ver si el fichero acaba en `0a` (`\n`). |
|
|
| `echo $?` | Código de salida del último comando: `0` es éxito. |
|
|
|
|
## Solo en Windows (MSYS2)
|
|
|
|
| Comando | Qué hace |
|
|
|---|---|
|
|
| `objdump -p hello.exe \| grep "DLL Name"` | Lista las DLL de las que depende el ejecutable. |
|
|
| `strip hello.exe` | Quita símbolos e información de depuración. |
|
|
| `gcc -static ...` | Enlaza estáticamente todas las librerías posibles. |
|
|
|
|
## Make
|
|
|
|
| Comando | Qué hace |
|
|
|---|---|
|
|
| `make` | Construye el primer objetivo del `Makefile`. |
|
|
| `make build/escpos.o` | Construye un objetivo concreto. |
|
|
| `make CC=clang` | Sobrescribe una variable del Makefile para esta ejecución. No recompila lo que ya está al día. |
|
|
| `make clean` | Borra lo generado (si el Makefile tiene esa regla y está en `.PHONY`). |
|
|
| `touch fichero` | Actualiza la fecha del fichero sin cambiar su contenido. Make lo verá como modificado. |
|
|
| `cat -A Makefile` | Muestra los caracteres invisibles: `^I` es un tabulador y `$` es el fin de línea. |
|
|
|
|
## Errores típicos y qué significan
|
|
|
|
| Mensaje | Quién lo da | Causa |
|
|
|---|---|---|
|
|
| `fichero.c:línea:col: error:` | Compilador | Error en el código fuente. |
|
|
| `undefined reference to 'x'` | Enlazador (`ld`, `collect2`) | Un `U` sin ninguna `T`: falta pasar un `.o` o una librería. |
|
|
| `multiple definition of 'x'` | Enlazador | Dos `T` con el mismo nombre. A menudo, un cuerpo de función en un `.h`. |
|
|
| `missing separator` | Make | La receta empieza por espacios en vez de tabulador. |
|
|
| `'x' is up to date` | Make | No es un error: el objetivo es más nuevo que todos sus prerrequisitos. Si `x` es una acción (`clean`), falta en `.PHONY`. |
|
|
| `no newline at end of file` | Clang | El fichero no termina en `\n`. |
|
|
|
|
## Go equivalente
|
|
|
|
| Go | C |
|
|
|---|---|
|
|
| `go build -x` | Ver los comandos que se ejecutan por dentro. |
|
|
| `go build -work` | Conservar los intermedios (como `-save-temps`). |
|
|
| `go build -ldflags="-s -w"` | Quitar símbolos (como `strip`). |
|