Làm cách nào để buộc make / GCC hiển thị cho tôi các lệnh?


275

Tôi đang cố gắng gỡ lỗi một vấn đề biên dịch, nhưng dường như tôi không thể lấy GCC (hoặc có thể nó được tạo ra ??) để hiển thị cho tôi trình biên dịch và trình liên kết thực tế mà nó đang thực thi.

Đây là đầu ra tôi đang thấy:

  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

Những gì tôi muốn thấy nên tương tự như thế này:

$ 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

Lưu ý cách ví dụ này có gcclệnh hoàn chỉnh được hiển thị. Ví dụ trên chỉ đơn thuần hiển thị những thứ như "CCLD libvirt_parthelper". Tôi không chắc làm thế nào để kiểm soát hành vi này.


Bạn đang chạy một makefile, hay chỉ là một gcclệnh?
Máy xay sinh tố

20
Điều này trông giống như đầu ra Kbuild hoặc Autotools . Hãy thử make V=1.
jww

Câu trả lời:


274

Để gọi một cuộc chạy khô :

make -n

Điều này sẽ cho thấy những gì makeđang cố gắng làm.


30
Đã tìm thấy nó :) make V = 1 Mặc dù gợi ý trên về "make -n" cũng hoạt động tốt. :) Cảm ơn tất cả các hồi đáp của bạn.
hernejj

75
Sự khác biệt là make -nkhông thực thi các lệnh. Do đó, câu trả lời đúng làmake V=1
m-ric

19
make V=1chỉ hoạt động nếu Makefile hỗ trợ nó. makefiles của automake làm điều đó, nhưng nhiều người khác thì không.
larsr

53
Đối với CMake, sử dụng make VERBOSE=1; cho autotools GNU make V=1.
Ruslan

10
@ m-ric nếu bạn muốn chạy thực sự chạy các lệnh, hãy xem xét make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 郝海东 冠状 病 事件

175

Các tệp tạo thư viện, được tạo bởi autotools ( ./configurebạn phải phát hành) thường có tùy chọn dài dòng, vì vậy về cơ bản, sử dụng make VERBOSE=1hoặc make V=1sẽ cung cấp cho bạn các lệnh đầy đủ.

Nhưng điều này phụ thuộc vào cách tạo tệp tạo.

Các -dtùy chọn có thể giúp đỡ, nhưng nó sẽ cung cấp cho bạn một kết quả cực kỳ dài.


60
Lưu ý: Makefiles do CMake tạo chỉ hỗ trợ VERBOSE=1, không hỗ trợ V=1.
blinry

3
V = 1 làm việc cho tôi, biên dịch nuttx với mips-linux-gnu-gcc, cảm ơn bạn.
jcomeau_ictx 18/07/14

141

Xây dựng phương pháp độc lập hệ thống

make SHELL='sh -x'

là một lựa chọn khác. Mẫu Makefile:

a:
    @echo a

Đầu ra:

+ echo a
a

Cái này đặt SHELLbiến đặc biệt cho make-xyêu shcầu in dòng mở rộng trước khi thực hiện nó.

Một lợi thế hơn -nlà thực sự chạy các lệnh. Tôi đã thấy rằng đối với một số dự án (ví dụ nhân Linux) -ncó thể ngừng chạy sớm hơn bình thường có lẽ là do vấn đề phụ thuộc.

Một nhược điểm của phương pháp này là bạn phải đảm bảo rằng lớp vỏ sẽ được sử dụng là lớp vỏ shmặc định được Make sử dụng vì chúng là POSIX, nhưng có thể được thay đổi bằng SHELLbiến make.

Làm sh -vcũng sẽ rất tuyệt, nhưng Dash 0.5.7 (Ubuntu 14.04 sh) bỏ qua -ccác lệnh (dường như là cách makesử dụng nó) vì vậy nó không làm gì cả.

make -p cũng sẽ làm bạn quan tâm, trong đó in các giá trị của các biến đặt.

CMake tạo Makefiles

make VERBOSE=1

Xem: Sử dụng CMake với GNU Make: Làm cách nào tôi có thể thấy các lệnh chính xác?


11
Chắc chắn là câu trả lời tốt nhất không phụ thuộc vào mức độ Makefile ban đầu được viết / tạo ra
gật đầu

2
Nếu bất cứ ai có thể giải thích về downvote, hãy cho tôi biết để tôi có thể tìm hiểu và cải thiện thông tin ;-)
Ciro Santilli 冠状 病

thực hiện SHELL='$$SHELL -x'sẽ làm cho $SHELLnghĩa đen mà không được đánh giá. Sử dụng make SHELL="$SHELL -x"sẽ làm việc.
Rick van der Zwet

1
đây là câu trả lời chung chung nhất, ngược lại với một số câu trả lời khác, điều này không phụ thuộc vào việc sử dụng cmake
Mike76

2
làm cho SHELL = 'sh -x' là siêu!
Jackie Yeh

22

Vì GNU Make phiên bản 4.0, --traceđối số là một cách hay để nói điều gì và tại sao một tệp thực hiện, tạo ra các dòng như:

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

hoặc là

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

1
Đối số này in thông tin chi tiết hơn chạy khô. Rất hữu ích để hiểu các hệ thống có quá trình xây dựng phức tạp như dpdk.
Makerj

19

Sử dụng make V=1

Các đề xuất khác ở đây:

  • make VERBOSE=1 - đã không làm việc ít nhất từ ​​các thử nghiệm của tôi.
  • make -n- chỉ hiển thị hoạt động hợp lý, không thực hiện dòng lệnh. Ví dụCC source.cpp

  • make --debug=j - cũng hoạt động, nhưng cũng có thể cho phép xây dựng đa luồng, gây ra đầu ra thêm.


4
make VERBOSE=1dành cho CMake. Các thử nghiệm của bạn rất có thể với các dự án dựa trên autotools.
Ruslan

12

Tôi thích sử dụng:

make --debug=j

Nó hiển thị các lệnh mà nó thực thi:

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

--debug [= FLAGS]

In thông tin gỡ lỗi ngoài xử lý bình thường. Nếu FLAGS bị bỏ qua, thì hành vi tương tự như -dđược chỉ định. FLAGS có thể là một đầu ra cho tất cả các đầu ra gỡ lỗi (giống như sử dụng -d), bđể gỡ lỗi cơ bản, vđể gỡ lỗi cơ bản dài dòng hơn, iđể hiển thị các quy tắc ngầm, jđể biết chi tiết về việc gọi lệnhmgỡ lỗi trong khi làm lại các tệp tạo.


7

Tùy thuộc vào phiên bản tự động của bạn, bạn cũng có thể sử dụng điều này:

make AM_DEFAULT_VERBOSITY=1

Tham khảo: AM_DEFAULT_VERBOSITY

Lưu ý: Tôi đã thêm câu trả lời này vì V=1không làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.