Wie zwinge ich make / GCC, mir die Befehle anzuzeigen?

275

Ich versuche, ein Kompilierungsproblem zu debuggen, aber ich kann GCC (oder vielleicht ist es make ??) nicht dazu bringen, mir die tatsächlichen Compiler- und Linker-Befehle anzuzeigen, die es ausführt.

Hier ist die Ausgabe, die ich sehe:

  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

Was ich sehen möchte, sollte ungefähr so ​​aussehen:

$ 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

Beachten Sie, wie in diesem Beispiel der vollständige gccBefehl angezeigt wird. Das obige Beispiel zeigt lediglich Dinge wie "CCLD libvirt_parthelper". Ich bin mir nicht sicher, wie ich dieses Verhalten kontrollieren soll.

hernejj
quelle
Führen Sie ein Makefile oder nur einen gccBefehl aus?
Blender
20
Dies sieht aus wie eine Kbuild- oder Autotools- Ausgabe. Versuchen Sie es make V=1.
JWW

Antworten:

274

So rufen Sie einen Trockenlauf auf :

make -n

Dies zeigt, was makeversucht zu tun.

Chrisaycock
quelle
30
Gefunden :) make V = 1 Obwohl der obige Vorschlag von "make -n" auch funktioniert hat. :) Vielen Dank für Ihre Antworten.
Hernejj
75
Der Unterschied besteht darin, dass make -ndie Befehle nicht ausgeführt werden. Somit ist die richtige Antwortmake V=1
m-ric
19
make V=1funktioniert nur, wenn das Makefile es unterstützt. Die Makefiles von automake machen das, aber viele andere nicht.
Larsr
53
Verwenden Sie für CMake make VERBOSE=1; für GNU Autotools make V=1.
Ruslan
10
@ m-ric Wenn Sie die Befehle tatsächlich ausführen möchten, beachten Sie make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 法轮功 冠状 病 六四 事件 21
175

Bibliotheks-Makefiles, die von Autotools generiert werden (die ./configureSie ausgeben müssen), haben häufig eine ausführliche Option. Verwenden Sie also grundsätzlich die vollständigen Befehle make VERBOSE=1oder make V=1sollten Sie diese erhalten.

Dies hängt jedoch davon ab, wie das Makefile generiert wurde.

Die -dOption könnte helfen, aber es gibt Ihnen eine extrem lange Ausgabe.

Gui13
quelle
60
Hinweis: CMake-generierte Makefiles unterstützen nur VERBOSE=1, nicht V=1.
Blinry
3
V = 1 hat für mich funktioniert und Nuttx mit mips-linux-gnu-gcc kompiliert, danke.
jcomeau_ictx
141

Systemunabhängige Methode erstellen

make SHELL='sh -x'

ist eine andere Option. Beispiel Makefile:

a:
    @echo a

Ausgabe:

+ echo a
a

Damit wird die besondere SHELLVariable für makeund -xerzählt shvor der Ausführung es die erweiterte Linie zu drucken.

Ein Vorteil gegenüber -nist, dass tatsächlich die Befehle ausgeführt werden. Ich habe festgestellt, dass bei einigen Projekten (z. B. Linux-Kernel) die -nAusführung möglicherweise aufgrund von Abhängigkeitsproblemen viel früher als gewöhnlich eingestellt wird.

Ein Nachteil dieser Methode ist, dass Sie sicherstellen müssen, dass die Shell verwendet wird sh, die verwendet wird. Dies ist die Standard- Shell, die von Make verwendet wird , da es sich um POSIX handelt, die jedoch mit der SHELLVariablen make geändert werden kann.

Das sh -vwäre auch cool, aber Dash 0.5.7 (Ubuntu 14.04 sh) ignoriert -cBefehle (was anscheinend so ist, wie es makeverwendet wird), sodass es nichts tut.

make -p wird Sie auch interessieren, die die Werte der eingestellten Variablen druckt.

CMake hat Makefiles generiert

make VERBOSE=1

Siehe: Verwenden von CMake mit GNU Make: Wie kann ich die genauen Befehle anzeigen?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
11
Auf jeden Fall die beste Antwort, die nicht davon abhängt, wie gut das ursprüngliche Makefile geschrieben / generiert wurde
nodakai
2
Wenn jemand die Ablehnung erklären kann, lass es mich wissen, damit ich die Informationen lernen und verbessern kann
;-)
make SHELL='$$SHELL -x'wird ein $SHELLLiteral erstellen, das nicht ausgewertet wird. Verwenden make SHELL="$SHELL -x"wird funktionieren.
Rick van der Zwet
1
Dies ist die beste generische Antwort, im Gegensatz zu einigen anderen Antworten hängt dies nicht von der Verwendung von cmake ab
Mike76
2
make SHELL = 'sh -x' ist super!
Jackie Yeh
22

Seit GNU Make Version 4.0 ist das --traceArgument eine gute Möglichkeit zu sagen, was und warum ein Makefile tut, indem Zeilen wie die folgenden ausgegeben werden:

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

oder

makefile:12: update target 'foo' due to: bar
Julien Palard
quelle
1
Dieses Argument gibt detailliertere Informationen aus als der Trockenlauf. Es ist sehr hilfreich zu verstehen, wie man Systeme erstellt, die einen komplexen Erstellungsprozess wie dpdk haben.
Makerj
19

Verwenden make V=1

Weitere Vorschläge hier:

  • make VERBOSE=1 - hat zumindest aus meinen Versuchen nicht funktioniert.
  • make -n- Zeigt nur die logische Operation an, nicht die ausgeführte Befehlszeile. Z.BCC source.cpp

  • make --debug=j - funktioniert auch, kann aber auch das Erstellen von Multithreads ermöglichen und zusätzliche Ausgabe verursachen.

TarmoPikaro
quelle
4
make VERBOSE=1ist für CMake. Ihre Versuche wurden höchstwahrscheinlich mit Projekten durchgeführt, die auf GNU-Autotools basieren.
Ruslan
12

Ich benutze gerne:

make --debug=j

Es zeigt die Befehle, die es ausführt:

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

--debug [= FLAGGEN]

Drucken Sie zusätzlich zur normalen Verarbeitung Debugging-Informationen. Wenn die FLAGS weggelassen werden, ist das Verhalten das gleiche wie -dangegeben. FLAGS kann für alle Debugging-Ausgaben (wie bei der Verwendung -d), bfür das grundlegende Debuggen, vfür ein ausführlicheres grundlegendes Debuggen, izum Anzeigen impliziter Regeln, jfür Details zum Aufrufen von Befehlen und mzum Debuggen beim erneuten Erstellen von Makefiles verwendet werden.

Santiago Villafuerte
quelle
7

Abhängig von Ihrer Automake-Version können Sie auch Folgendes verwenden:

make AM_DEFAULT_VERBOSITY=1

Referenz: AM_DEFAULT_VERBOSITY

Hinweis: Ich habe diese Antwort hinzugefügt, da V=1sie bei mir nicht funktioniert hat.

Ru Hasha
quelle