Make / GCC komutunu bana komutları göstermeye nasıl zorlarım?


277

Bir derleme sorunu hata ayıklamaya çalışıyorum, ama bana yürütmekte olduğu gerçek derleyici ve bağlayıcı komutları göstermek için GCC (veya belki de yapmak ??) almak gibi olamaz.

İşte gördüğüm çıktı:

  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

Ne görmek istiyorum buna benzer olmalıdır:

$ 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

Bu örnekte tam gcckomutun nasıl görüntülendiğine dikkat edin. Yukarıdaki örnekte yalnızca "CCLD libvirt_parthelper" gibi şeyler gösterilmektedir. Bu davranışı nasıl denetleyeceğinizden emin değilim.


Bir makefile veya sadece bir gcckomut mu kullanıyorsunuz?
Blender

20
Bu, Kbuild veya Autotools çıktısına benziyor . Deneyin make V=1.
jww

Yanıtlar:


275

Kuru bir koşuyu başlatmak için :

make -n

Bu ne makeyapmaya çalıştığını gösterecektir .


31
Bulundu :) yapmak V = 1 Her ne kadar "make -n" yukarıdaki öneri de çalıştı. :) Yanıtlarınız için hepinize teşekkür ederim.
hernejj

76
Fark, make -nkomutları yürütmemesi. Böylece doğru cevapmake V=1
m-ric 15

20
make V=1yalnızca Makefile destekliyorsa çalışıyor. automake'ın markaları bunu yapar, ama diğerleri bunu yapmaz.
larsr

53
CMake için make VERBOSE=1; GNU otomobilleri için make V=1.
Ruslan

10
@ m-ric gerçekten komutları çalıştırmak istiyorsanız, şunları göz önünde bulundurun make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

175

Autotools tarafından oluşturulan kütüphane markaları ( ./configurevermeniz gerekir) genellikle ayrıntılı bir seçeneğe sahiptir, bu nedenle temel olarak, tam komutları kullanmanız make VERBOSE=1veya make V=1vermeniz gerekir.

Ancak bu, makefile'ın nasıl oluşturulduğuna bağlıdır.

-dSeçenek yardımcı olabilir ama bu size son derece uzun çıktı verecektir.


60
Not: CMake tarafından üretilen Makefiles desteklemez VERBOSE=1, desteklemez V=1.
Mart'ta blinry

3
V = 1 benim için çalıştı, nips'i mips-linux-gnu-gcc ile derledi, teşekkürler.
jcomeau_ictx

141

Sistemden bağımsız yöntem oluşturma

make SHELL='sh -x'

başka bir seçenektir. Örnek Makefile:

a:
    @echo a

Çıktı:

+ echo a
a

Bu özel ayarlar SHELLiçin değişken makeve -xsöyler shçalıştırmadan önce genişletilmiş bir çizgi yazdırmak için.

Bir avantajı -naslında komutları çalıştırmasıdır. Bazı projelerde (örneğin Linux çekirdeği) -nmuhtemelen bağımlılık sorunları nedeniyle normalden çok daha erken çalışmayı durdurabileceğini buldum .

Bu yöntemin bir dezavantajı, kullanılacak kabuğun sh, POSIX oldukları için Make tarafından kullanılan, ancak SHELLmake değişkeniyle değiştirilebilecek varsayılan olduğundan emin olmanızdır .

Yapmak sh -vda iyi olurdu, ancak Dash 0.5.7 (Ubuntu 14.04 sh) -ckomutları yok sayar (bu nasıl makekullanılır gibi görünüyor ), böylece hiçbir şey yapmaz.

make -p ayrıca ayarlanan değişkenlerin değerlerini basan ilginizi çekecektir.

CMake Makefiles Üretimi

make VERBOSE=1

Bakınız: CMake'i GNU ile kullanma Marka: Tam komutları nasıl görebilirim?


11
Orijinal Makefile'in ne kadar iyi yazıldığına / üretildiğine bağlı olmayan kesinlikle en iyi cevap
nodakai

2
Herhangi biri downvote açıklayabilir, ben öğrenmek ve bilgi geliştirmek ;-) bana bildirin ;-)
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

make SHELL='$$SHELL -x', $SHELLdeğerlendirilmeyen değişmez bir bilgi verecektir . Kullanmak make SHELL="$SHELL -x"işe yarayacak.
Rick van der Zwet

1
Bu en iyi genel cevap, diğer bazı cevapların aksine, bu cmake kullanmaya bağlı değildir
Mike76

2
SHELL yap = 'sh -x' süper!
Jackie Yeh

22

GNU Make 4.0 sürümünden beri, --traceargüman bir makefile'in neyi ve neden yaptığını söylemenin güzel bir yoludur:

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

veya

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

1
Bu argüman kuru çalışmadan daha ayrıntılı bilgi yazdırır. Dpdk gibi karmaşık oluşturma süreçlerine sahip sistemleri yapmak çok yararlıdır.
makerj

20

kullanım make V=1

Buradaki diğer öneriler:

  • make VERBOSE=1 - en azından denemelerimden işe yaramadı.
  • make -n- yürütülmekte olan komut satırını değil, yalnızca mantıksal işlemi görüntüler. ÖrneğinCC source.cpp

  • make --debug=j - aynı zamanda çalışır, ancak çok iş parçacıklı binaları da etkinleştirerek ekstra çıktıya neden olabilir.


4
make VERBOSE=1CMake içindir. Denemeleriniz büyük olasılıkla GNU otomatik araç tabanlı projelerde yapıldı.
Ruslan

12

Kullanmayı seviyorum:

make --debug=j

Yürüttüğü komutları gösterir:

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

--debug [= BAYRAK]

Normal işleme ek olarak hata ayıklama bilgilerini yazdırın. FLAGS belirtilmezse, davranış -dbelirtildiyse aynıdır . FLAGS, tüm hata ayıklama çıktıları (kullanımla aynı -d), btemel hata ayıklama, vdaha ayrıntılı temel hata ayıklama, iörtük kuralları göstermek j, komutların çağrılmasıyla ilgili ayrıntılar ve myeniden oluşturma sırasında hata ayıklama için olabilir.


7

Otomatik yapım sürümünüze bağlı olarak şunları da kullanabilirsiniz:

make AM_DEFAULT_VERBOSITY=1

Referans: AM_DEFAULT_VERBOSITY

Not: Bu cevabı V=1benim için çalışmadığından ekledim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.