2008-10-15 40 views
11

Tôi bắt buộc phải viết tài liệu cho dự án hiện tại của mình liệt kê tất cả các tệp .c và mỗi tệp liệt kê mọi tệp .h được tệp trực tiếp hoặc gián tiếp bao gồm.Tự động phát hiện phụ thuộc C

Đây là một dự án lớn, và mặc dù chúng tôi có Makefiles về mặt lý thuyết có thông tin này, những Makefiles đôi khi không chính xác (chúng tôi kế thừa dự án này từ một công ty khác). Chúng tôi thường phải thực hiện một số make clean ; make để các thay đổi của chúng tôi thực sự được phản ánh trong việc biên dịch lại, vì vậy tôi không muốn dựa vào các Makefiles này. Vì vậy, có một công cụ cho phép chúng tôi cung cấp cho nó tên của một tập tin .c và một đường dẫn bao gồm và có nó cho chúng tôi biết tất cả các tập tin .h được trực tiếp hoặc gián tiếp bao gồm bởi các tập tin .c? Chúng tôi không có bất kỳ điều gì lạ như

#define my_include "some_file.h" 
#include my_include 

vì vậy công cụ không cần phải hoàn hảo. Bất kỳ thứ gì tìm kiếm tệp .c và .h trong một đường dẫn bao gồm để bao gồm thông thường sẽ là đủ tốt.

Trả lời

14

Những gì tôi làm trong Makefile của tôi là

SRCS=$(wildcard *.c) 

depend: $(SRCS) 
    gcc -M $(CFLAGS) $(SRCS) >depend 

include depend 

Điều này có nghĩa rằng nếu bất kỳ của các tập tin nguồn được cập nhật, sự cai trị phụ thuộc sẽ chạy, và sử dụng -M gcc để cập nhật các tập tin gọi là phụ thuộc. Điều này sau đó được bao gồm trong makefile để cung cấp các quy tắc phụ thuộc cho tất cả các tệp nguồn.

Hãy kiểm tra xem tệp có được cập nhật hay không trước khi bao gồm tệp, vì vậy quy tắc phụ thuộc này sẽ chạy nếu cần thiết bất cứ khi nào bạn chạy mà không cần phải thực hiện "phụ thuộc".

Điều này sẽ chạy bất kỳ lúc nào bất kỳ tệp nào đã thay đổi. Tôi chưa bao giờ tìm thấy vấn đề này, nhưng nếu bạn có một số lượng lớn tệp trong thư mục, bạn có thể thấy mất quá nhiều thời gian, trong trường hợp này bạn có thể thử một tệp phụ thuộc cho mỗi tệp nguồn như sau:

SRCS=$(wildcard *.c) 
DEPS=$(SRCS:.c=.dep) 

%.dep : %.c 
    gcc -M $(CFLAGS) $< >[email protected] 

include $(DEPS) 

Lưu ý rằng bạn có thể sử dụng -MM thay vì -M để không bao gồm tiêu đề hệ thống.

+0

Bạn có thể thay đổi một tiêu đề để bao gồm một tiêu đề phụ, do đó thay đổi phụ thuộc của tất cả các tập tin nguồn, nhưng danh sách phụ thuộc của bạn sẽ không được cập nhật. Bắt nó hoàn toàn đúng có thể khá khó sử dụng IIRC, nhưng một khởi đầu tốt là bao gồm tất cả các tiêu đề của riêng bạn trong các phụ thuộc của phụ thuộc. –

+2

Ồ, và để lưu ý hiệu suất, việc này sẽ xử lý lại tất cả các tệp nếu có bất kỳ tệp nào thay đổi. Vì vậy, bạn có thể muốn có nhiều tệp phụ thuộc (có thể thậm chí một tệp cho mỗi tệp nguồn).Cuối cùng, lưu ý rằng bạn thường có thể sử dụng -MM, bỏ qua các phụ thuộc vào các tiêu đề hệ thống, vì bạn sẽ không thay đổi chúng. –

+0

Thực ra tôi đã nói dối - Tôi luôn sử dụng -MM bản thân mình –

5

"gcc -M file.c" thực hiện những gì bạn cần.

1

Trong MSVC (2005 và 2008 ít nhất, có thể là các phiên bản khác nhưng không phải VC6), bạn có thể yêu cầu trình biên dịch cho bạn biết tất cả các tệp đã được đưa vào trong quá trình biên dịch. Đầu ra khá dài, nhưng hoàn toàn và khá dễ dàng để phân tích cú pháp bằng mắt người.

Trong Cài đặt dự án, chuyển đến tab C/C++> Nâng cao và chuyển "Hiển thị bao gồm", sau đó xây dựng lại dự án của bạn từ đầu.

+0

Hoặc từ dòng lệnh/makefile: -showIncludes –

4

Cách thay thế cho gcc -M là fastdep. Tác giả của Fastdep báo cáo nhanh hơn gấp 10 lần so với gcc's -M. Nếu dự án mất một thời gian để xây dựng, fastdep có thể đáng xem.

2

Sử dụng SCons

$ scons --tree=all 
scons: Reading SConscript files ... 

scons: done reading SConscript files. 
scons: Building targets ... 
scons: `.' is up to date. 
+-. 
    +-SConstruct 
    +-app 
    | +-test.o 
    | | +-test.c 
    | | +-/include/PCI_1149_1.h 
    | | +-/include/Pci.h 
    | | +-/usr/bin/gcc 
    | +-/usr/bin/gcc 
    | +-/lib/libpci1149_64.a 
    ... 
+0

Rất tốt! Tôi thực sự đã xem qua API SCons vì tôi đã hình dung rằng tôi phải lén lút xung quanh với các bộ phận bên trong của nó để làm điều đó. Tôi sẽ lưu ý chuyển đổi dòng lệnh này trong tương lai. –

Các vấn đề liên quan