2008-09-17 85 views
11

大型項目的依賴頭我工作的一個非常大的規模的項目,在編譯時間很長。我可以在Linux上使用哪些工具(最好是開放源代碼)來查找包含最多的文件並優化它們的使用? 爲了更清楚,我需要一個工具,它會給出依賴關係,告訴我哪些頭是最包含的。順便說一句,我們使用分佈式編譯如何找到在Linux上

+0

爲了更清楚,我需要一個工具,它會給出依賴關係,告訴我哪些頭文件是最包含的。 順便說一句,我們使用分佈式編譯 – user12371 2008-09-17 07:59:11

+0

也許你應該編輯你的問題,以包括這些信息,而不是將它作爲評論? – Daemin 2008-09-17 08:18:57

回答

0

你可能想看看分佈式的編譯,例如參見distcc

4

退房makdepend

+0

這給了我每個文件的依賴關係。我需要一些有鑑於此,會找到最多的文件。 – user12371 2008-09-17 08:04:22

2

工具,比如doxygen(與graphviz的選項一起使用)可以生成依賴關係圖包含文件...我不不知道他們是否會爲你想要做的事提供足夠的概述,但這可能值得嘗試。

0

這不是你正在搜索的內容,它可能不容易設置,但可能你可以看看lxr:lxr.linux.no是一個可瀏覽的內核樹。

在搜索框中,如果你輸入一個文件名,它會在那裏它被包含給你。 但是,這仍然是猜測,它不跟蹤鏈式依賴關係。

也許

strace -e trace=open -o outfile make 
grep 'some handy regex to match header' 
1

如果你想知道哪些文件包含最重要的是,使用這個bash命令:

發現。 -name '的.cpp' -exec egrep的「^ [:空間:]的#include [[:空間:]] + [ 「<] [[:阿爾法:] [:數字:] _] + [」> ]'{} \;

|排序| uniq -c | sort -k 1rn,1
|頭-20

它會顯示排名前20的文件,其中包括的次數排名。

說明:第1行找到的所有* .cpp文件,並從中「的#include」指令提取線。第二行計算每個文件包含的次數,第三行包含20個主要包含的文件。

+0

還沒有檢查過,但如果使用兩個不同的路徑包含相同的文件,則解決方案將不起作用。即#include 和#include <./ dev/blah.h>將被視爲不同的包含文件。 – Daemin 2008-09-17 08:13:18

2

使用「粘在一起很多小工具」的Unix哲學我建議編寫與-M(或-MM)和-MF(OUTFILE)選項(如詳細here)調用gcc的一個簡短的腳本。這將爲make工具生成依賴項列表,然後您可以輕鬆解析(相對於直接解析源文件)並提取出所需的信息。

4

答案here將爲您提供跟蹤#include依賴關係的工具。但是沒有提到優化等。另外:「大規模C++軟件設計」一書應該有所幫助。

2

從源樹的根級別,並執行以下(\ t爲製表符):

find . -exec grep '[ \t]*#include[ \t][ \t]*["<][^">][">]' {} ';' 
    | sed 's/^[ \t]*#include[ \t][ \t]*["<]//' 
    | sed 's/[">].*$//' 
    | sort 
    | uniq -c 
    | sort -r -k1 -n 

第1行得到的所有包括線。 第2行除去實際文件名前的所有內容。 第3行剝離行的末尾,只留下文件名。 第4行和第5行計算每條唯一行。 第6行按行數倒序排序。

1

使用ccache。它會將輸入散列到一個編譯中,並緩存結果,這將大大提高這些編譯的速度。

如果你想檢測多張包括,這樣你就可以刪除它們,你可以使用makedepend作爲尤利安Şerbănoiu提示:

makedepend -m *.c -f - > /dev/null 

會給出警告每個多個包含。

1

頁面中找到的Bash腳本不是很好的解決方案。它只適用於簡單的項目。實際上,在大型項目中,像在頁眉中描述的那樣,經常使用C預處理器(#if,#else,...)。只有好的軟件比較複雜,比如makedependscons可以提供很好的信息。 gcc -E可以提供幫助,但在大型項目中,其結果分析是浪費時間。