Estoy tratando de depurar un problema de compilación, pero parece que no consigo que GCC (o tal vez esté hecho?) Para mostrarme los comandos reales del compilador y el enlazador que está ejecutando. Aquí está la salida que estoy viendo:
CCLD libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1
Lo que quiero ver debería ser similar a esto:
$ make
gcc -Wall -c -o main.o main.c
gcc -Wall -c -o hello_fn.o hello_fn.c
gcc main.o hello_fn.o -o main
Observe cómo este ejemplo muestra el comando gcc completo. El ejemplo anterior simplemente muestra cosas como "CCLD libvirt_parthelper". No estoy seguro de cómo controlar este comportamiento.
Para invocar un funcionamiento en seco :
make -n
Esto mostrará lo que make
está intentando hacer.
Los archivos make de la biblioteca, que son generados por autotools (el ./configure
que debe emitir) a menudo tienen una opción detallada, por lo que básicamente, usar make VERBOSE=1
o make V=1
debería darle los comandos completos.
Pero esto depende de cómo se generó el makefile.
La opción -d
puede ayudar pero le dará una salida extremadamente larga.
Construir método independiente del sistema
make Shell='sh -x'
es otra opción. Muestra Makefile
:
a:
@echo a
Salida:
+ echo a
a
Esto establece la variable Shell
especial para make
, y -x
le dice a sh
que imprima la línea expandida antes de ejecutarla.
Una ventaja sobre -n
es que en realidad ejecuta los comandos. He encontrado que para algunos proyectos (por ejemplo, kernel de Linux), -n
puede dejar de ejecutarse mucho antes de lo habitual, probablemente debido a problemas de dependencia.
Una desventaja de este método es que debe asegurarse de que el Shell que se usará sea sh
, que es el predeterminado que utiliza Make, ya que son POSIX, pero que podría cambiarse con la variable Shell
make.
Hacer sh -v
también sería genial, pero Dash 0.5.7 (Ubuntu 14.04 sh
) ignora los comandos -c
(que parece ser cómo make
lo usa), por lo que no hace nada.
make -p
también le interesará, que imprime los valores de las variables establecidas.
CMake generó Makefiles
make VERBOSE=1
Consulte: Uso de CMake con GNU Marca: ¿Cómo puedo ver los comandos exactos?
Dado que GNU Make versión 4.0, el argumento --trace
es una buena forma de decir qué y por qué hace un makefile, generando líneas como:
makefile:8: target 'foo.o' does not exist
o
makefile:12: update target 'foo' due to: bar
Usa make V=1
Otras sugerencias aquí:
make VERBOSE=1
- no funcionó al menos desde mis pruebas.make -n
- muestra solo la operación lógica, no la línea de comandos que se está ejecutando. P.ej. CC source.cpp
make --debug=j
- también funciona, pero también puede habilitar la creación de varios subprocesos, lo que provoca una salida extra.
Dependiendo de su versión automake, también puede usar esto:
make AM_DEFAULT_VERBOSITY=1
Referencia: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html
Nota: Agregué esta respuesta ya que V=1
no funcionó para mí.
Me gusta usar:
make --debug=j
Muestra los comandos que ejecuta:
https://linux.die.net/man/1/make
--debug [= FLAGS] Imprime información de depuración además del procesamiento normal. Si se omiten los FLAGS, entonces el comportamiento es el mismo que si se especificara -d. FLAGS puede ser una para toda la salida de depuración (igual que usar -d), b para la depuración básica, v para una depuración básica más detallada, i para mostrar reglas implícitas, j para detalles sobre la invocación de comandos y m para depurar mientras rehace makefiles.