Estoy tratando de depurar un problema de compilación, pero parece que no puedo obtener GCC (¿o tal vez es make ??) 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 gcc
comando completo . El ejemplo anterior simplemente muestra cosas como "CCLD libvirt_parthelper". No estoy seguro de cómo controlar este comportamiento.
gcc
comando?make V=1
.Respuestas:
Para invocar una ejecución en seco :
Esto mostrará lo que
make
está intentando hacer.fuente
make -n
no ejecuta los comandos. Así respuesta correcta esmake V=1
make V=1
solo funciona si el Makefile lo admite. Los makefiles de automake hacen eso, pero muchos otros no.make VERBOSE=1
; para autotools GNUmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245Los archivos MAKE de la biblioteca, que son generados por autotools (el
./configure
que tiene que emitir) a menudo tienen una opción detallada, por lo que básicamente, usarmake VERBOSE=1
omake V=1
debería darle los comandos completos.Pero esto depende de cómo se generó el archivo MAKE.
La
-d
opción puede ayudar, pero le dará una salida extremadamente larga.fuente
VERBOSE=1
, noV=1
.Construir método independiente del sistema
Es otra opción. Muestra
Makefile
:Salida:
Esto establece la
SHELL
variable especial paramake
y-x
le indicash
que imprima la línea expandida antes de ejecutarla.Una ventaja sobre
-n
es que realmente ejecuta los comandos. He encontrado que para algunos proyectos (por ejemplo, el kernel de Linux) que-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 utilizará sea
sh
, que es el predeterminado que utiliza Make, ya que son POSIX, pero podría modificarse con laSHELL
variable make.Hacerlo también
sh -v
sería genial, pero Dash 0.5.7 (Ubuntu 14.04sh
) ignora los-c
comandos (que parece ser cómo lomake
usa), por lo que no hace nada.make -p
también le interesará, lo que imprime los valores de las variables establecidas.CMake generó Makefiles
Ver: Uso de CMake con GNU Make: ¿Cómo puedo ver los comandos exactos?
fuente
SHELL='$$SHELL -x'
hará$SHELL
literal lo que no se evalúa. Usarmake SHELL="$SHELL -x"
funcionará.Desde GNU Make versión 4.0, el
--trace
argumento es una buena manera de decir qué y por qué hace un archivo MAKE, generando líneas como:o
fuente
Utilizar
make V=1
Otras sugerencias aquí:
make VERBOSE=1
- No funcionó al menos desde mis ensayos.make -n
- muestra solo la operación lógica, no la línea de comando que se está ejecutando. P.ejCC source.cpp
make --debug=j
- también funciona, pero también puede habilitar la construcción de subprocesos múltiples, lo que genera un rendimiento adicionalfuente
make VERBOSE=1
es para CMake. Sus pruebas fueron más probables con proyectos basados en herramientas automáticas GNU.Me gusta usar:
Muestra los comandos que ejecuta:
https://linux.die.net/man/1/make
--debug [= BANDERAS]
Imprima información de depuración además del procesamiento normal. Si se omiten las BANDERAS, el comportamiento es el mismo que si
-d
se especificara. Las BANDERAS pueden ser para todas las salidas de depuración (lo mismo 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 ym
para la depuración mientras se rehacen los archivos MAKE.fuente
Dependiendo de su versión de automake, también puede usar esto:
Referencia: AM_DEFAULT_VERBOSITY
Nota: agregué esta respuesta ya
V=1
que no funcionó para mí.fuente