Saya mencoba men-debug masalah kompilasi, tetapi sepertinya saya tidak bisa mendapatkan GCC (atau mungkin itu membuat ??) untuk menunjukkan kepada saya perintah kompiler dan tautan yang sebenarnya sedang dijalankan.
Inilah output yang saya lihat:
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
Apa yang ingin saya lihat harus serupa dengan ini:
$ 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
Perhatikan bagaimana contoh ini gcc
menampilkan perintah lengkap yang ditampilkan. Contoh di atas hanya menunjukkan hal-hal seperti "CCLD libvirt_parthelper". Saya tidak yakin bagaimana mengendalikan perilaku ini.
gcc
perintah?make V=1
.Jawaban:
Untuk menjalankan dry run :
Ini akan menunjukkan apa
make
yang coba dilakukan.sumber
make -n
tidak menjalankan perintah. Jadi jawaban yang benar adalahmake V=1
make V=1
hanya berfungsi jika Makefile mendukungnya. makefile automake melakukan itu, tetapi banyak yang lain tidak.make VERBOSE=1
; untuk autotool GNUmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245File makefile perpustakaan, yang dihasilkan oleh autotool (
./configure
Anda harus mengeluarkan) sering memiliki opsi verbose, jadi pada dasarnya, menggunakanmake VERBOSE=1
ataumake V=1
harus memberi Anda perintah penuh.Tapi ini tergantung pada bagaimana makefile dihasilkan.
The
-d
pilihan mungkin membantu, tapi itu akan memberikan output yang sangat panjang.sumber
VERBOSE=1
, tidakV=1
.Membangun metode independen sistem
adalah pilihan lain. Sampel
Makefile
:Keluaran:
Ini menetapkan
SHELL
variabel khusus untukmake
, dan-x
memberi tahush
untuk mencetak garis yang diperluas sebelum menjalankannya.Satu kelebihan di atas
-n
adalah bahwa sebenarnya menjalankan perintah. Saya telah menemukan bahwa untuk beberapa proyek (misalnya kernel Linux) yang-n
mungkin berhenti berjalan jauh lebih awal dari biasanya mungkin karena masalah ketergantungan.Salah satu kelemahan metode ini adalah Anda harus memastikan bahwa shell yang akan digunakan adalah
sh
, yang merupakan default yang digunakan oleh Make karena POSIX, tetapi dapat diubah denganSHELL
variabel make.Melakukannya
sh -v
juga akan keren, tetapi Dash 0.5.7 (Ubuntu 14.04sh
) mengabaikan-c
perintah (yang sepertinya caramake
menggunakannya) sehingga tidak melakukan apa-apa.make -p
juga akan menarik bagi Anda, yang mencetak nilai-nilai variabel yang ditetapkan.CMake menghasilkan Makefile
Lihat: Menggunakan CMake dengan GNU Make: Bagaimana saya bisa melihat perintah yang tepat?
sumber
SHELL='$$SHELL -x'
akan membuat$SHELL
literal yang tidak dievaluasi. Menggunakanmake SHELL="$SHELL -x"
akan berhasil.Sejak GNU Make versi 4.0,
--trace
argumennya adalah cara yang bagus untuk mengetahui apa dan mengapa makefile melakukan, menghasilkan baris seperti:atau
sumber
Menggunakan
make V=1
Saran lain di sini:
make VERBOSE=1
- tidak bekerja setidaknya dari cobaan saya.make -n
- Hanya menampilkan operasi logis, bukan baris perintah yang dieksekusi. MisalnyaCC source.cpp
make --debug=j
- berfungsi juga, tetapi mungkin juga mengaktifkan bangunan multi-ulir, menyebabkan output tambahan.sumber
make VERBOSE=1
adalah untuk CMake. Uji coba Anda kemungkinan besar dilakukan dengan proyek berbasis autotools GNU.Saya suka menggunakan:
Ini menunjukkan perintah yang dijalankan:
https://linux.die.net/man/1/make
--debug [= BENDERA]
Cetak informasi debugging di samping pemrosesan normal. Jika FLAGS dihilangkan, maka perilakunya sama seperti jika
-d
ditentukan. FLAGS mungkin untuk semua hasil debugging (sama seperti menggunakan-d
),b
untuk debugging dasar , untuk debugging dasar yangv
lebih banyak,i
untuk menunjukkan aturan implisit,j
untuk detail tentang pemanggilan perintah , danm
untuk debugging saat membuat ulang makefile.sumber
Bergantung pada versi automake Anda, Anda juga dapat menggunakan ini:
Referensi: AM_DEFAULT_VERBOSITY
Catatan: Saya menambahkan jawaban ini karena
V=1
tidak berfungsi untuk saya.sumber