2011-03-23 145 views
7

如何使用C++構建依賴關係樹?依賴關係樹我的意思是,例如,檢查某個程序需要運行的文件。通過檢查,我可以找到是否有任何丟失或損壞的文件。構建依賴樹

我該怎麼做?

編輯:

我不是在尋找一個程序,它會爲我!

+0

謝謝,我知道這個工具,但我正在尋找如何自己做。當然,我不需要像這個工具那樣複雜的東西。我只想構建一個非常基本的依賴列表。 – Lockhead 2011-03-23 22:01:58

+1

假設您想要爲可執行文件而不是源代碼執行此操作,則需要指定平臺(編譯後,您關心的是可執行格式,而不是源代碼語言)。 – 2011-03-23 22:44:46

+0

我需要它跨平臺 – Lockhead 2011-03-23 22:47:18

回答

2

沒有用於計算依賴跨平臺的方法,因爲這實際上不是一個C++問題。它與編譯器輸出的可執行格式有關,並且在每個平臺上都不相同。

在Linux(和其他可能Unix系統),該ldd命令是你想要的。這將打印出可執行文件所需的(遞歸)模塊,並且還會告訴您在系統中當前可以找到它們的位置。

在Windows上,Dependency Walker是一個很好的圖形化工具,可以讓您探索所有的可執行文件(或另一個DLL)取決於的DLL。

+0

當然,這隻能檢測對其他庫的依賴關係。如果你正在尋找一個程序需要運行的文件(比如圖像文件等,以及在運行時動態加載的庫),沒有簡單的方法來完成這個任務,因爲這些文件不是在編譯時確定的時間。在Linux上,'strace'(grep是'open'的輸出)告訴你進程在運行時打開的所有文件,但是它當然只會告訴你該程序的特定運行情況,而不是它將嘗試打開的所有可能的文件。 – mgiuca 2011-03-24 01:12:34

+0

但是,這仍然不能告訴我如何在Windows上實際構建依賴關係樹(現在讓我們忘記Linux,因爲我的大多數用戶都在Windows上)。我可以用一個工具來做,但我正在尋找如何編寫一個C++程序來完成它,可能使用一個庫。 – Lockhead 2011-03-24 11:44:07

+0

我不知道你會如何在Windows上做到這一點。在Linux上,這很容易,因爲ldd是一個命令行工具。你只需要打開一個ldd的套接字並讀取出來的文本。在Windows上,人們通常會構建不可能以編程方式訪問的GUI工具。 – mgiuca 2011-03-24 23:56:03

0

只是一個建議談論的Windows時:你可以寫,捕捉所有的呼叫從您的應用程序中打開,讀,寫,...一個文件,要求建立篩選可能這些文件作爲標準文件列表中選擇一個模塊輸入/輸出,港口,設備等

你可以做到這一點也可以在Linux(這比在Windows更容易)。

反正,我不知道如何建立一個層次結構(樹)。以防萬一:您可以在與另一個解決方案(如ldd,dep walker等)的情況下使用此解決方案。

+0

如何編寫該模塊? – Lockhead 2011-03-24 12:15:36

+0

如果您需要使用谷歌「Windows API hook」搜索此問題的一般信息。 MS-Rem在[wasm.ru]上有優秀的文章(http://wasm.ru/publist.php?list=21#series_8),但不幸的是用俄語。我還發現爲此目的而編寫的特殊庫[hook-api](http://www.hook-api。com /),但我從來沒有用過它。如果你需要更具體的答案(你可以怎麼寫,可以使用什麼API函數等),只需創建一個新的問題或郵件給我:) – maverik 2011-03-24 12:26:26

+0

如果你可以使用該模塊來構建依賴樹,我真的需要知道如何寫它。我想我會郵寄給你。你的電子郵件是什麼?謝謝! – Lockhead 2011-03-24 12:43:02