J'essaie de déboguer un problème de compilation, mais je n'arrive pas à obtenir GCC (ou peut-être que c'est make ??) pour me montrer les commandes réelles du compilateur et de l'éditeur de liens qu'il exécute.
Voici la sortie que je vois:
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
Ce que je veux voir devrait ressembler à ceci:
$ 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
Remarquez comment cet exemple affiche la gcc
commande complete . L'exemple ci-dessus montre simplement des choses comme "CCLD libvirt_parthelper". Je ne sais pas comment contrôler ce comportement.
gcc
Exécutez -vous un makefile ou simplement une commande?make V=1
.Réponses:
Pour invoquer un essai à sec :
Cela montrera ce que vous
make
essayez de faire.la source
make -n
n'exécute pas les commandes. Ainsi, la bonne réponse estmake V=1
make V=1
ne fonctionne que si le Makefile le prend en charge. Les makefiles d'automake le font, mais beaucoup d'autres non.make VERBOSE=1
; pour les autotools GNUmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245Les makefiles de bibliothèque, qui sont générés par les outils automatiques (ceux que
./configure
vous devez émettre) ont souvent une option détaillée, donc en gros, utilisermake VERBOSE=1
oumake V=1
devrait vous donner les commandes complètes.Mais cela dépend de la façon dont le makefile a été généré.
L'
-d
option pourrait aider, mais elle vous donnera une sortie extrêmement longue.la source
VERBOSE=1
, nonV=1
.Construire une méthode indépendante du système
est une autre option. Échantillon
Makefile
:Production:
Cela définit la
SHELL
variable spéciale pourmake
, et-x
indiquesh
d'imprimer la ligne développée avant de l'exécuter.Un des avantages
-n
est qu'il exécute les commandes. J'ai constaté que pour certains projets (par exemple, le noyau Linux) qui-n
peuvent cesser de fonctionner beaucoup plus tôt que d'habitude, probablement en raison de problèmes de dépendance.Un inconvénient de cette méthode est que vous devez vous assurer que le shell qui sera utilisé est
sh
celui par défaut utilisé par Make car ils sont POSIX, mais pourrait être modifié avec laSHELL
variable make.Faire
sh -v
serait aussi cool, mais Dash 0.5.7 (Ubuntu 14.04sh
) ignore les-c
commandes (ce qui semble être la façon dontmake
il l'utilise) donc il ne fait rien.make -p
vous intéressera également, qui imprime les valeurs des variables définies.Makefiles générés par CMake
Voir: Utiliser CMake avec GNU Make: Comment puis-je voir les commandes exactes?
la source
SHELL='$$SHELL -x'
rendra$SHELL
littéral qui n'est pas évalué. L'utilisationmake SHELL="$SHELL -x"
fonctionnera.Depuis GNU Make version 4.0, l'
--trace
argument est un bon moyen de dire quoi et pourquoi un makefile fait, en sortant des lignes comme:ou
la source
Utilisation
make V=1
Autres suggestions ici:
make VERBOSE=1
- n'a pas fonctionné au moins de mes essais.make -n
- affiche uniquement l'opération logique, pas la ligne de commande en cours d'exécution. Par exempleCC source.cpp
make --debug=j
- fonctionne également, mais peut également activer la construction multithread, provoquant une sortie supplémentaire.la source
make VERBOSE=1
est pour CMake. Vos essais étaient très probablement avec des projets basés sur GNU autotools.J'aime utiliser:
Il montre les commandes qu'il exécute:
https://linux.die.net/man/1/make
--debug [= FLAGS]
Imprimez les informations de débogage en plus du traitement normal. Si les FLAGS sont omis, le comportement est le même que si a
-d
été spécifié. FLAGS peut être un pour toutes les sorties de débogage (identique à l'utilisation-d
),b
pour le débogage de base , pour un débogage de basev
plus détaillé,i
pour afficher des règles implicites,j
pour des détails sur l'appel de commandes etm
pour le débogage lors de la refonte de makefiles.la source
Selon votre version d'automake, vous pouvez également utiliser ceci:
Référence: AM_DEFAULT_VERBOSITY
Remarque: j'ai ajouté cette réponse car
V=1
cela ne fonctionnait pas pour moi.la source