Come posso forzare make / GCC a mostrarmi i comandi?


277

Sto cercando di eseguire il debug di un problema di compilazione, ma non riesco a convincere GCC (o forse è fatto ??) a mostrarmi i comandi del compilatore e del linker che sta eseguendo.

Ecco l'output che sto vedendo:

  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

Quello che voglio vedere dovrebbe essere simile a questo:

$ 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

Notare come in questo esempio sia gccvisualizzato il comando completo . L'esempio sopra mostra semplicemente cose come "CCLD libvirt_parthelper". Non sono sicuro di come controllare questo comportamento.


Stai eseguendo un makefile o solo un gcccomando?
Blender,

20
Sembra un output di Kbuild o Autotools . Prova make V=1.
1616

Risposte:


275

Per invocare una corsa a secco :

make -n

Questo mostrerà cosa makesta tentando di fare.


31
Trovato :) :) V = 1 Anche se il suggerimento sopra di "make -n" ha funzionato. :) Grazie a tutti per le vostre risposte.
Hernejj,

76
La differenza è che make -nnon esegue i comandi. Quindi la risposta corretta èmake V=1
m-ric,

20
make V=1funziona solo se il Makefile lo supporta. I makefile di automake lo fanno, ma molti altri no.
Larsr

53
Per CMake, utilizzare make VERBOSE=1; per autotools GNU make V=1.
Ruslan,

10
@ m-ric se si desidera eseguire effettivamente eseguire i comandi, considerano make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli郝海东冠状病六四事件法轮功

175

I makefile delle librerie, che sono generati dagli autotools (il ./configureproblema che devi emettere) hanno spesso un'opzione dettagliata, quindi sostanzialmente, usando make VERBOSE=1o make V=1dovrebbero darti i comandi completi.

Ma questo dipende da come è stato generato il makefile.

L' -dopzione potrebbe aiutare, ma ti darà un output estremamente lungo.


60
Nota: CMake generati Makefiles solo il supporto VERBOSE=1, non è V=1.
blinry

3
V = 1 ha funzionato per me, compilando nuttx con mips-linux-gnu-gcc, grazie.
jcomeau_ictx,

141

Costruisci metodo indipendente dal sistema

make SHELL='sh -x'

è un'altra opzione. Campione Makefile:

a:
    @echo a

Produzione:

+ echo a
a

Questo imposta la SHELLvariabile speciale per makee -xdice shdi stampare la linea espansa prima di eseguirla.

Uno dei vantaggi -nè che in realtà esegue i comandi. Ho scoperto che per alcuni progetti (ad es. Kernel Linux) che -npotrebbero smettere di funzionare molto prima del solito probabilmente a causa di problemi di dipendenza.

Uno svantaggio di questo metodo è che è necessario assicurarsi che la shell che verrà utilizzata shsia quella predefinita utilizzata da Make in quanto POSIX, ma potrebbe essere modificata con la SHELLvariabile make.

fare sh -v sarebbe bello, ma Dash 0.5.7 (Ubuntu 14.04 sh) ignora i -ccomandi (che sembra essere il modo in cui lo makeusa), quindi non fa nulla.

make -p ti interesserà anche, che stampa i valori delle variabili impostate.

Makefile generati da CMake

make VERBOSE=1

Vedi: Usare CMake con GNU Make: Come posso vedere i comandi esatti?


11
Sicuramente la risposta migliore che non dipende da quanto bene sia stato scritto / generato il Makefile originale
nodakai,

2
Se qualcuno può spiegare il downvote, fammi sapere in modo che io possa imparare e migliorare le informazioni ;-)
Ciro Santilli 21 冠状 病 六四 事件 法轮功

make SHELL='$$SHELL -x'renderà $SHELLletterale ciò che non viene valutato. L'uso make SHELL="$SHELL -x"funzionerà.
Rick van der Zwet,

1
questa è la migliore risposta generica, a differenza di altre risposte, ciò non dipende dall'uso di cmake
Mike76,

2
make SHELL = 'sh -x' è super!
Jackie Yeh,

22

Dalla versione 4.0 di GNU Make, l' --traceargomento è un buon modo per dire cosa e perché un makefile fa, producendo linee come:

makefile:8: target 'foo.o' does not exist

o

makefile:12: update target 'foo' due to: bar

1
Questo argomento stampa informazioni più dettagliate rispetto alla marcia a secco. È molto utile capire come creare sistemi con processi di compilazione complessi come dpdk.
makerj,

20

Uso make V=1

Altri suggerimenti qui:

  • make VERBOSE=1 - non ha funzionato almeno dalle mie prove.
  • make -n- visualizza solo le operazioni logiche, non la riga di comando in esecuzione. Per esempioCC source.cpp

  • make --debug=j - funziona anche, ma potrebbe anche abilitare la costruzione multi-thread, causando un output extra.


4
make VERBOSE=1è per CMake. Molto probabilmente le tue prove sono state condotte con progetti basati su autotools GNU.
Ruslan,

12

Mi piace usare:

make --debug=j

Mostra i comandi che esegue:

https://linux.die.net/man/1/make

--debug [= flags]

Stampa le informazioni di debug oltre alla normale elaborazione. Se i FLAGS vengono omessi, il comportamento è lo stesso di se -dfosse stato specificato. FLAGS può essere un output per tutto il debug (uguale all'utilizzo -d), bper il debug di base , per un debug di base vpiù dettagliato, iper mostrare regole implicite, jper dettagli sull'invocazione di comandi e mper il debug durante il rifacimento dei makefile.


7

A seconda della versione di automake, puoi anche utilizzare questo:

make AM_DEFAULT_VERBOSITY=1

Riferimento: AM_DEFAULT_VERBOSITY

Nota: ho aggiunto questa risposta poiché V=1non ha funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.