Làm thế nào để biết tệp tiêu đề được bao gồm từ đâu?


97

Làm cách nào để biết g ++ có thể tìm thấy tệp bao gồm ở đâu? Về cơ bản nếu tôi

#include <foo.h>

g ++ sẽ quét đường dẫn tìm kiếm, sử dụng bất kỳ tùy chọn bao gồm nào để thêm hoặc thay đổi đường dẫn. Nhưng, vào cuối ngày, có cách nào tôi có thể biết đường dẫn tuyệt đối của foo.h mà g ++ đã chọn để biên dịch không? Đặc biệt có liên quan nếu có nhiều hơn một foo.h trong vô số đường dẫn tìm kiếm.

Không có cách nào để hoàn thành điều đó ... có cách nào để g ++ cho tôi biết đường dẫn tìm kiếm cuối cùng của nó là gì sau khi bao gồm mặc định và tất cả bao gồm tùy chọn không?


1
Liên quan: có cách nào để biết (các) tệp bao gồm cha mà một tệp bao gồm con được đưa vào từ không? Tức là để hiển thị bao gồm-từ đồ thị (Gợi ý: gcc -E không phải là khá đó ... có thể được xử lý để mang lại điều đó.)
Krazy Glew

Câu trả lời:


78

Điều này sẽ tạo ra các phụ thuộc liệt kê các đường dẫn tuyệt đối của các tệp bao gồm:

gcc  -M showtime.c

Nếu bạn không muốn hệ thống bao gồm (tức là #include <something.h>) thì hãy sử dụng:

gcc  -MM showtime.c

18
Cần lưu ý rằng nếu bạn sử dụng kết hợp với "-o myObj.o", đầu ra, không phải nhị phân đã biên dịch, sẽ chuyển thành "myObj.o". -M có một -E ngầm định, vì vậy việc biên dịch không bị lỗi. Thay vào đó, tôi thấy -MD là một tùy chọn rất hữu ích, nó thực hiện biên dịch và đặt đầu ra trong myObj.d thay thế. Tạo một tham số phù hợp để chỉ thêm trước dòng biên dịch của bạn mà không có các hiệu ứng lạ như * .o hiện chứa đầu ra thay vì nhị phân. Cảm ơn bạn đã giúp đỡ.
harschware

Tất cả các tùy chọn gcc liên quan được mô tả ở đây .
akhan

105
g++ -H ...

cũng sẽ in đường dẫn đầy đủ của các tệp bao gồm trong một định dạng cho biết tiêu đề nào bao gồm


7
Điều này có vẻ hữu ích hơn -M theo kinh nghiệm của tôi. Tôi thích cách hiển thị phân cấp của những gì bao gồm những gì.
Brian Minton

Tốt, nó hữu ích cho mục đích gỡ lỗi.

1
Đây là câu trả lời tốt nhất. Bạn có thể thêm nó vào quy trình xây dựng của mình mà không cần thay đổi bất kỳ điều gì khác.
Timmmm

4
Điều này thực sự trả lời câu hỏi nhiều hơn câu trả lời được chấp nhận. Chỉ có một vấn đề đáng tiếc là tôi không thể làm cho nó ngăn Clang cố gắng biên dịch tệp một cách bình thường, vì vậy tôi đã sử dụng clang++ -MM -H(đó là một sự kết hợp hơi hữu ích).
tân binh1024

@ tân binh1024 Sử dụng clang++ -H -fsyntax-only ...nếu bạn muốn tránh tạo tệp đầu ra (cũng có tác dụng gcc).
Lekensteyn

8

Sử dụng chắc chắn

g++ -E -dI  ... (whatever the original command arguments were)

2
Có một số lợi ích đối với giải pháp này: 1. Bạn có thể khám phá nhiều phần bao gồm của một tệp tiêu đề duy nhất (-H và -M chỉ in mỗi tệp được bao gồm một lần) 2. Bạn có thể xem nó được bao gồm ở đâu (tên và số dòng của tệp gốc bao gồm hướng dẫn). (!) 3. Qua đó bạn có thể chắc chắn phân biệt cho dù một tiêu đề được bao gồm trực tiếp hoặc gián tiếp hoặc cả hai (Điều này rất quan trọng cho dọn dẹp.)
hagello

5

Nếu bạn sử dụng -MMhoặc một trong các tùy chọn liên quan ( -M, v.v.), bạn sẽ chỉ nhận được danh sách các tiêu đề được bao gồm mà không có tất cả đầu ra của bộ tiền xử lý khác (mà bạn dường như nhận được với g++ -E -dIgiải pháp được đề xuất ).


g++ -MM t.cccho thấy không bao gồm cả, chỉ t.o: t.cc. Nó có cần thứ gì khác không?
wallyk

3
Tốt - để hoàn thiện, bạn có thể nhận được tương tự với MSVC bằng cách sử dụng /showIncludes tùy chọn. MSVC thậm chí sẽ thụt lề để hiển thị cho bạn lồng ghép các tiêu đề (tôi không thấy điều đó với -Mtrên GCC).
Michael Burr
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.