402 Stimmen

Wie zwinge ich make/GCC, mir die Befehle zu zeigen?

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

Hier ist die Ausgabe, die ich erhalte:

  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 in etwa 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, dass dieses Beispiel die vollständige gcc Befehl angezeigt. Das obige Beispiel zeigt lediglich Dinge wie "CCLD libvirt_parthelper". Ich bin mir nicht sicher, wie man dieses Verhalten steuern kann.

385voto

chrisaycock Punkte 34286

Zum Aufrufen einer Trockenlauf :

make -n

Dies wird zeigen, was make zu tun versucht.

252voto

Systemunabhängige Methode erstellen

make SHELL='sh -x'

ist eine weitere Option. Muster Makefile :

a:
    @echo a

Ausgabe:

+ echo a
a

Damit wird die spezielle SHELL variabel für make y -x sagt sh um die erweiterte Zeile vor der Ausführung zu drucken.

Ein Vorteil gegenüber -n ist, dass er die Befehle tatsächlich ausführt. Ich habe festgestellt, dass bei einigen Projekten (z. B. Linux-Kernel) die -n kann aufgrund von Abhängigkeitsproblemen viel früher als üblich aufhören zu laufen.

Ein Nachteil dieser Methode ist, dass Sie sicherstellen müssen, dass die zu verwendende Shell sh die standardmäßig von Make verwendet wird, da sie POSIX sind, kann aber mit der Option SHELL variabel machen.

Tun sh -v wäre auch cool, aber Dash 0.5.7 (Ubuntu 14.04 sh ) ignoriert für -c Befehle (was anscheinend die Art und Weise ist, wie make verwendet), so dass es nichts bewirkt.

make -p wird Sie ebenfalls interessieren, denn es gibt die Werte der eingestellten Variablen aus.

CMake generierte Makefiles unterstützen immer VERBOSE=1

Wie in:

mkdir build
cd build
cmake ..
make VERBOSE=1

Gewidmete Frage an: CMake mit GNU Make verwenden: Wie kann ich die genauen Befehle sehen?

215voto

Gui13 Punkte 12487

Bibliotheks-Makefiles, die von Autotools erzeugt werden (die ./configure die Sie ausgeben müssen) haben oft eine ausführliche Option, so dass im Grunde die Verwendung von make VERBOSE=1 o make V=1 sollten Sie die vollständigen Befehle erhalten.

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

En -d könnte helfen, aber die Ausgabe ist dann extrem lang.

38voto

Julien Palard Punkte 7481

Seit GNU Make Version 4.0 ist die --trace Argument ist ein guter Weg, um zu sagen, was und warum ein Makefile tut, indem es Zeilen wie ausgibt:

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

o

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

31voto

TarmoPikaro Punkte 4208

Utilice make V=1

Weitere Vorschläge hier:

  • make VERBOSE=1 - funktionierte nicht, zumindest bei meinen Versuchen.

  • make -n - zeigt nur die logische Operation an, nicht die Befehlszeile, die ausgeführt wird. z.B. CC source.cpp

  • make --debug=j - funktioniert ebenfalls, kann aber auch die Erstellung in mehreren Threads ermöglichen, was zusätzliche Ausgaben verursacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X