J'essaie de déboguer un problème de compilation, mais je n'arrive pas à obtenir que GCC (ou peut-être que ce soit make ??) me montre 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 être semblable à 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
Notez que la commande complète gcc
est affichée dans cet exemple. L'exemple ci-dessus montre simplement des choses comme "CCLD libvirt_parthelper". Je ne sais pas comment contrôler ce comportement.
Pour invoquer un cycle d'essai:
make -n
Cela montrera ce que make
tente de faire.
Les makefiles de bibliothèque, qui sont générés par autotools (le ./configure
que vous devez utiliser) ont souvent une option prolixe, aussi utilisez-vous make VERBOSE=1
ou make V=1
pour vous donner les commandes complètes.
Mais cela dépend de la façon dont le makefile a été généré.
L'option -d
peut vous aider, mais vous obtiendrez une sortie extrêmement longue.
Construire une méthode indépendante du système
make Shell='sh -x'
est une autre option. Exemple Makefile
:
a:
@echo a
Sortie:
+ echo a
a
Ceci définit la variable spéciale Shell
pour make
et -x
indique à sh
d’imprimer la ligne développée avant de l’exécuter.
Un avantage sur -n
est qu’il exécute les commandes. J'ai constaté que pour certains projets (par exemple, le noyau Linux), -n
pouvait cesser de s'exécuter beaucoup plus tôt que d'habitude, probablement à cause 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 utilisé par défaut par Make car ils sont POSIX, mais qui pourrait être modifié avec le Shell
make variable.
Faire sh -v
serait bien aussi, mais Dash 0.5.7 (Ubuntu 14.04 sh
) ignore les commandes -c
(ce qui semble être la façon dont make
l'utilise) ne fait rien.
make -p
vous intéressera également, ce qui affiche les valeurs des variables définies.
Créer des Makefiles
make VERBOSE=1
Voir: tiliser CMake avec GNU Make: Comment puis-je voir les commandes exactes?
Depuis GNU Make version 4.0, l'argument --trace
est un moyen agréable de dire ce que fait un makefile et pourquoi il le fait, en affichant des lignes telles que:
makefile:8: target 'foo.o' does not exist
ou
makefile:12: update target 'foo' due to: bar
Utilisez 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 exemple. CC source.cpp
make --debug=j
- fonctionne également, mais peut également permettre la construction multithread, générant une sortie supplémentaire.
J'aime utiliser:
make --debug=j
Il montre les commandes qu'il exécute:
https://linux.die.net/man/1/make
--debug [= FLAGS]
Imprimer les informations de débogage en plus du traitement normal. Si les drapeaux sont omis, le comportement est le même que si -d
était spécifié. FLAGS peut être une sortie pour toutes les sorties de débogage (comme pour -d
), b
pour le débogage de base, v
pour un débogage de base plus détaillé, i
pour afficher des règles implicites j
pour plus de détails sur l'invocation de commandes , et m
pour le débogage lors de la reconstruction de fichiers Make.
Selon votre version d'automake, vous pouvez également utiliser ceci:
make AM_DEFAULT_VERBOSITY=1
Référence: AM_DEFAULT_VERBOSITY
Remarque: j'ai ajouté cette réponse car V=1
ne fonctionnait pas pour moi.