Hoe dwing ik make/GCC om me de commando’s te laten zien?

Ik probeer een compilatieprobleem op te lossen, maar ik kan GCC (of misschien is het make??) niet zover krijgen om me de eigenlijke compiler- en linkercommando’s te laten zien die het uitvoert.

Dit is de uitvoer die ik zie:

 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

Wat ik wil zien zou er ongeveer zo uit moeten zien:

$ 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

Merk op hoe in dit voorbeeld de volledige opdracht gccwordt weergegeven. Het bovenstaande voorbeeld toont alleen dingen als “CCLD libvirt_parthelper”. Ik weet niet zeker hoe ik dit gedrag moet beheersen.


Antwoord 1, autoriteit 100%

Een droogloopoproepen:

make -n

Dit laat zien wat makeprobeert te doen.


Antwoord 2, autoriteit 59%

Bibliotheek-makefiles, die worden gegenereerd door autotools (de ./configuredie u moet uitgeven) hebben vaak een uitgebreide optie, dus in feite gebruiken ze make VERBOSE=1of make V=1zou je de volledige commando’s moeten geven.

Maar dit hangt af van hoe de makefile is gegenereerd.

De optie -dkan helpen, maar het geeft je een extreem lange uitvoer.


Antwoord 3, autoriteit 54%

Systeemonafhankelijke methode bouwen

make SHELL='sh -x'

is een andere optie. Voorbeeld Makefile:

a:
    @echo a

Uitvoer:

+ echo a
a

Dit stelt de speciale SHELLvariabele in voor make, en -xvertelt shom de uitgevouwen regel af te drukken voordat u het uitvoert.

Een voordeel ten opzichte van -nis dat de commando’s daadwerkelijk worden uitgevoerd. Ik heb ontdekt dat voor sommige projecten (bijv. Linux-kernel) -nveel eerder dan normaal kan stoppen met draaien, waarschijnlijk vanwege afhankelijkheidsproblemen.

Een nadeel van deze methode is dat je ervoor moet zorgen dat de shell die zal worden gebruikt shis, wat de standaard is die door Make wordt gebruikt omdat ze POSIX zijn, maar kan worden gewijzigd met de SHELLvariabel maken.

Het zou ook cool zijn om sh -vte doen, maar Dash 0.5.7 (Ubuntu 14.04 sh) negeert voor -ccommando’s ( wat lijkt te zijn hoe makehet gebruikt), dus het doet niets.

make -pzal u ook interesseren, dat de waarden van ingestelde variabelen afdrukt.

CMake gegenereerde Makefiles ondersteunen altijd VERBOSE=1

Als in:

mkdir build
cd build
cmake ..
make VERBOSE=1

Speciale vraag op: Met CMake met GNU Make: Hoe kan ik de exacte commando’s zien?


Antwoord 4, autoriteit 9%

Sinds GNU Make versie 4.0 is het argument --traceeen leuke manier om te vertellen wat en waarom een makefile doet, met als output regels als:

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

of

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

Antwoord 5, autoriteit 6%

Gebruik make V=1

Andere suggesties hier:

  • make VERBOSE=1– werkte in ieder geval niet bij mijn proefversies.
  • make -n– geeft alleen de logische bewerking weer, niet de opdrachtregel die wordt uitgevoerd. bijv. CC source.cpp

  • make --debug=j– werkt ook, maar kan ook multithreaded bouwen mogelijk maken, wat extra output veroorzaakt.


Antwoord 6, autoriteit 4%

Ik gebruik graag:

make --debug=j

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

–debug[=FLAGS]

Debugging-informatie afdrukken naast de normale verwerking. Als de vlaggen worden weggelaten, dan is het gedrag hetzelfde als het -dis opgegeven. Vlaggen kunnen een A Voor alle foutopsporingsuitvoer zijn (hetzelfde als het gebruik van -d), bvoor basisbrugging, vvoor meer uitgebreide basisdebugging, iVoor het tonen van impliciete regels, jvoor meer informatie over aanroepen van opdrachten , en mvoor debugging tijdens het verwijderen van MAKEFILES.


Antwoord 7, Autoriteit 3%

Afhankelijk van uw automake-versie, kunt u dit ook gebruiken:

make AM_DEFAULT_VERBOSITY=1

Referentie: AM_DEFAULT_VERBELIES

Opmerking: ik heb dit antwoord toegevoegd sinds V=1werkte niet voor mij.

Other episodes