2008-10-15 98 views
11

我需要爲我當前的項目編寫文檔,其中列出了所有的.c文件,並且每個列出了該文件直接或間接包含的每個.h文件。自動發現C依賴關係

這是一個大型項目,雖然我們有理論上有這種信息的Makefiles,但這些Makefiles有時是不正確的(我們從另一家公司繼承了此項目)。我們經常必須爲我們的更改做一個make clean ; make實際上反映在重新編譯中,所以我不想依賴這些Makefiles。

那麼有沒有一種工具可以讓我們給它一個.c文件的名稱和一個包含路徑,並讓它告訴我們.c文件直接或間接包含的所有.h文件?我們沒有任何奇怪的東西像

#define my_include "some_file.h" 
#include my_include 

所以這個工具不需要是完美的。任何搜索包含常規包含路徑中的.c和.h文件都足夠好。

回答

14

我在Makefile中做的是

SRCS=$(wildcard *.c) 

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

include depend 

這意味着,如果任意一個源文件被更新時,依靠規則運行,並使用gcc -M更新名爲依賴於文件。這包含在makefile中,爲所有源文件提供相關性規則。

Make會在包含它之前檢查文件是否是最新的,因此,如果需要運行make,而不需要執行「make depend」,則此依賴規則將運行。

這將在任何時候任何文件發生變化時運行。我從未發現過這個問題,但是如果目錄中有大量文件,則可能會花費太長時間,在這種情況下,您可以嘗試每個源文件都有一個相關文件,如下所示:

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

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

include $(DEPS) 

請注意,您可以使用-MM而不是-M不包含系統標題。

+0

你可以改變一個頭,包括一個額外的頭,從而改變所有的源文件的依賴關係,但你所依賴的列表將不會被更新。完全正確地完成它可能非常費力IIRC,但一個好的開始是將所有自己的頭文件包含在依賴關係中。 – 2008-10-27 14:42:37

+2

哦,爲了提高性能,請注意,如果有任何文件發生更改,則會重新處理所有文件。所以你可能想要有多個依賴文件(甚至每個源文件可能有一個)。最後,請注意,您通常可以使用-MM,這會跳過對系統標題的依賴關係,因爲您不會更改它們。 – 2008-10-27 14:49:08

+0

其實我說謊 - 我總是用-MM我自己:) – 2008-10-28 17:11:47

5

「gcc -M file.c」可以滿足您的需求。

1

在MSVC(至少2005年和2008年,可能還有其他版本,但不是VC6),您可以讓編譯器告訴您編譯期間包含的所有文件。輸出結果非常詳細,但完整且相當容易用人眼分析。

在項目設置中,轉到C/C++>高級選項卡,然後切換「顯示包含」,然後從頭開始重建項目。

4

gcc -M的替代方案是fastdep。 Fastdep的作者報告fastdep比gcc -M快十倍。如果項目需要一段時間才能構建,fastdep可能值得一看。

2

使用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 
    ...