Công cụ để theo dõi các phụ thuộc #include [đã đóng]


175

Bất kỳ đề nghị tốt? Đầu vào sẽ là tên của một tệp tiêu đề và đầu ra phải là một danh sách (tốt nhất là một cây) của tất cả các tệp bao gồm nó trực tiếp hoặc gián tiếp.


4
Nó không phải là về một "yêu thích" bao gồm được hiển thị độc đáo trong gcc, nhưng msvs thì không. Vì vậy, chúng tôi (tôi) đang tìm kiếm bất kỳ công cụ.
tưởng tượng

70
Tại sao tôi cứ tìm những câu hỏi "ngoài chủ đề" rất hữu ích?
jfritz42

5
@ jfritz42: Điều này nên được trao giải thưởng "Bình luận của năm"! Làm thế nào một người điều hành có thể gắn nhãn một câu hỏi "lạc đề" khi có quá nhiều chủ đề và rất nhiều người dùng?
Totoro

2
Tôi muốn lưu ý rằng có nhiều công cụ hơn để xử lý các #includephụ thuộc như phụ thuộc cpp , iwyudep-matrix , một công cụ khá ngây thơ được viết bằng python.
vô nghĩa

3
@ jfritz42 Các con số rất rõ ràng: 123 phiếu và 62 lượt yêu thích. Nhiều người nhìn nó theo cách này. Tiêu chuẩn SO lạ. Tôi cũng nghi ngờ rằng những câu hỏi như vậy sẽ có cùng câu trả lời tuyệt vời trên SuperUser.
Andreas

Câu trả lời:


148

Nếu bạn có quyền truy cập vào GCC / G ++, thì -Mtùy chọn sẽ xuất ra danh sách phụ thuộc. Nó không làm bất kỳ công cụ bổ sung nào mà các công cụ khác làm, nhưng vì nó đến từ trình biên dịch, không có khả năng nó sẽ nhận các tệp từ vị trí "sai".


60
-Hthậm chí cho một cái cây!
SamB

28
-MMbỏ qua các tiêu đề hệ thống
TheJosh

3
Ngoài ra với -otùy chọn trình biên dịch sẽ ghi đầu ra vào tệp thay vì thiết bị xuất chuẩn.
Hi-Angel

2
@SamB Điều này chỉ hoạt động nếu không có lỗi và in ra stderrthay vì stdout. Nếu không, tùy chọn này là tổng quát hơn.
dùng877329

92

Cảm ơn KeithB. Tôi đã tra cứu các tài liệu cho cl.exe (VS2008) và tìm thấy cờ / showIncludes. Từ IDE, điều này có thể được đặt từ trang thuộc tính của bất kỳ tệp CPP nào.

Chụp màn hình


1
Điều này cực kỳ hữu ích trong việc giải quyết một số lỗi biên dịch / cảnh báo rất khó. Cảm ơn rất nhiều!
Ashwin Nanjappa

Điều này cũng cực kỳ tiện lợi khi cố gắng tối ưu hóa các tiêu đề được biên dịch trước!
fmuecke

Khi làm việc trong VS, tôi nghĩ đây là giải pháp nhanh nhất để giải quyết vấn đề của mình ~ :-)
yaobin

Đây dường như không làm việc, nếu một số tiêu đề không bao gồm một std c tiêu đề ví dụmath.h
abergmeier

29

Đối với một giải pháp trọng lượng nặng, bạn nên kiểm tra doxygen . Nó quét qua cơ sở mã của bạn và đưa ra một trang web, có hiệu quả, đó là tài liệu mã của bạn. Một trong nhiều thứ nó thể hiện là bao gồm cây xanh.

Nếu bạn đang tìm cách có thể cắm đầu ra của công cụ này vào một số quy trình khác, thì điều này có thể không phù hợp với bạn (mặc dù doxygen không xuất ra các định dạng khác, nhưng tôi không thực sự quen thuộc với tính năng đó). Nếu bạn chỉ đơn giản muốn nhãn cầu phụ thuộc, mặc dù vậy, nó sẽ hoạt động rất tốt.


20

Tôi đã chơi xung quanh với một công cụ gọi là cinclude2dot . Nó khá hữu ích trong việc xử lý một codebase khá lớn khi tôi đến làm việc ở đây. Cuối cùng tôi đã nghĩ đến việc tích hợp nó vào bản dựng hàng ngày của chúng tôi.


2
Công cụ này hoạt động đặc biệt tốt. Tôi gặp rắc rối với g ++ và doxygen của g ++.
xe trượt tuyết

Tôi đã viết một kịch bản python để đọc kết quả đầu ra của cinclude2dot và nhận tất cả sự phụ thuộc trong bản đồ và sau đó thực hiện chuyển đổi theo chiều sâu để cuối cùng tạo ra một rừng nguồn. Khu rừng không có bất kỳ .cc/.c/.cxxtệp nào trong đó (chỉ các .htệp trong đó) có thể là dự phòng.
shuva

12

Đầu tiên, cinclude2dot.pl là tập lệnh perl phân tích mã C / C ++ và tạo ra biểu đồ phụ thuộc #include dưới dạng tệp chấm để nhập vào graphviz.

http://www.flourish.org/cinclude2dot/

Nếu bạn không muốn đi theo cách của công cụ thủ công đó, thì theo tôi, người chiến thắng thực sự là một công cụ được gọi là "Bao gồm trình quản lý" từ ProFactor.

http://www.profactor.co.uk/includemanager.php

Có một thử nghiệm miễn phí, và nó là tuyệt vời. Đó là một bổ trợ cho Visual Studio được tích hợp hoàn toàn, vì vậy, nhấp đúp vào thứ gì đó ở đây sẽ đưa bạn đến nơi được bao gồm ở đó.

Chuyển chuột Tooltip cung cấp cho bạn tất cả thông tin bạn muốn và nó cho phép bạn xem chi tiết / xóa, xóa toàn bộ các cây con mà bạn không quan tâm, xem các biểu diễn khác ngoài biểu đồ, chuyển qua danh sách các kết quả khớp và điều này thật tuyệt vời.

Nếu bạn nhanh chóng về nó, bạn có thể cấu trúc lại cấu trúc #incoide của một dự án lớn trước khi hết thời gian dùng thử. Mặc dù vậy, nó không tốn nhiều tiền, khoảng $ 35 mỗi giấy phép.

Đối với những gì nó làm, nó chỉ là về hoàn hảo. Không chỉ #incolee đồ thị mà còn phụ thuộc chéo dự án của các tệp được chia sẻ, tác động đến thời gian xây dựng, thuộc tính chi tiết trong lưới, hoàn hảo.


Tôi đã sử dụng thành công Bao gồm trình quản lý trong dự án C của tôi. Tôi đang sử dụng Visual Studio 2013.
smwikipedia

Hơi nghi ngờ.
sdd

12

Tin tốt: redhat Source-Navigator (cũng chạy trên Windows). Tất nhiên, các trình chuyển đổi trình biên dịch (đã đề cập trước đó) có khả năng phân tích cú pháp vượt trội và tôi không chắc cách này sẽ xử lý MFC, Qt và các từ khóa ma thuật của chúng.

redhat Nguồn-Navigator


5

Dựa trên câu trả lời của KeithB, đây là cú pháp GNUmake để tự động 1) tạo các tệp phụ thuộc, 2) cập nhật chúng và 3) sử dụng chúng trong tệp tạo tệp của bạn:

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

(Đảm bảo thay đổi các vết lõm này thành hardtabs.)



3

Hiểu về C ++ sẽ có thể giúp bạn: nó xây dựng cơ sở dữ liệu mà bạn có thể truy cập từ Perl.


Hiểu là thương mại, nhưng đó là IMO đáng kinh ngạc. Bạn có thể dùng thử miễn phí.
skelliam

1

cscope ( http://cscope.sourceforge.net/ ) thực hiện điều này trong một xterm độc lập và cũng có thể được sử dụng trong trình soạn thảo yêu thích của bạn - nó có hỗ trợ emacs và vi / vim tuyệt vờ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.