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 gcc
Befehl angezeigt wird. Das obige Beispiel zeigt lediglich Dinge wie "CCLD libvirt_parthelper". Ich bin mir nicht sicher, wie ich dieses Verhalten kontrollieren soll.
gcc
Befehl aus?make V=1
.Antworten:
So rufen Sie einen Trockenlauf auf :
Dies zeigt, was
make
versucht zu tun.quelle
make -n
die Befehle nicht ausgeführt werden. Somit ist die richtige Antwortmake V=1
make V=1
funktioniert nur, wenn das Makefile es unterstützt. Die Makefiles von automake machen das, aber viele andere nicht.make VERBOSE=1
; für GNU Autotoolsmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245Bibliotheks-Makefiles, die von Autotools generiert werden (die
./configure
Sie ausgeben müssen), haben häufig eine ausführliche Option. Verwenden Sie also grundsätzlich die vollständigen Befehlemake VERBOSE=1
odermake V=1
sollten Sie diese erhalten.Dies hängt jedoch davon ab, wie das Makefile generiert wurde.
Die
-d
Option könnte helfen, aber es gibt Ihnen eine extrem lange Ausgabe.quelle
VERBOSE=1
, nichtV=1
.Systemunabhängige Methode erstellen
ist eine andere Option. Beispiel
Makefile
:Ausgabe:
Damit wird die besondere
SHELL
Variable fürmake
und-x
erzähltsh
vor der Ausführung es die erweiterte Linie zu drucken.Ein Vorteil gegenüber
-n
ist, dass tatsächlich die Befehle ausgeführt werden. Ich habe festgestellt, dass bei einigen Projekten (z. B. Linux-Kernel) die-n
Ausfü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 derSHELL
Variablen make geändert werden kann.Das
sh -v
wäre auch cool, aber Dash 0.5.7 (Ubuntu 14.04sh
) ignoriert-c
Befehle (was anscheinend so ist, wie esmake
verwendet wird), sodass es nichts tut.make -p
wird Sie auch interessieren, die die Werte der eingestellten Variablen druckt.CMake hat Makefiles generiert
Siehe: Verwenden von CMake mit GNU Make: Wie kann ich die genauen Befehle anzeigen?
quelle
SHELL='$$SHELL -x'
wird ein$SHELL
Literal erstellen, das nicht ausgewertet wird. Verwendenmake SHELL="$SHELL -x"
wird funktionieren.Seit GNU Make Version 4.0 ist das
--trace
Argument eine gute Möglichkeit zu sagen, was und warum ein Makefile tut, indem Zeilen wie die folgenden ausgegeben werden:oder
quelle
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.quelle
make VERBOSE=1
ist für CMake. Ihre Versuche wurden höchstwahrscheinlich mit Projekten durchgeführt, die auf GNU-Autotools basieren.Ich benutze gerne:
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
-d
angegeben. FLAGS kann für alle Debugging-Ausgaben (wie bei der Verwendung-d
),b
für das grundlegende Debuggen,v
für ein ausführlicheres grundlegendes Debuggen,i
zum Anzeigen impliziter Regeln,j
für Details zum Aufrufen von Befehlen undm
zum Debuggen beim erneuten Erstellen von Makefiles verwendet werden.quelle
Abhängig von Ihrer Automake-Version können Sie auch Folgendes verwenden:
Referenz: AM_DEFAULT_VERBOSITY
Hinweis: Ich habe diese Antwort hinzugefügt, da
V=1
sie bei mir nicht funktioniert hat.quelle