2010-03-31 36 views
2

有沒有辦法爲.obj文件生成C++頭文件?或者也許有一個實用程序可以查看.obj文件。我已經找到了在各種格式之間轉換的objconv,但我找不到任何.h生成器/查看器。生成視圖.obj文件的標頭

回答

4

鑑於C++標記,情況並不像其他答案暗示的那樣絕望。

特別是,至少在大多數C++編譯器中,函數的名稱會被損壞(Microsoft稱之爲「裝飾」),以指示該函數所採用的參數。編譯方案因編譯器而異,但實際上它們中的任何一個都編碼足夠的信息,以便爲函數重新創建聲明 - 返回類型,函數本身的名稱,類名稱(如果它是成員函數) ,以及函數期望的參數的確切數量和類型。

儘管不必通過重寫名稱來完成,但C++系統沒有真正的選擇,只能將參數信息包含在目標文件中。當你重載函數時,鏈接器需要一些方法來確定哪個超載與特定的調用相關聯。

我要補充一點,整理出這一切可能是相當多的工作中,雖然 - 只是舉例,如果代碼包括模板,在目標文件中的符號名稱將拓展出所有模板參數(包括默認參數)。只是舉例,考慮代碼瑣碎有點像這樣:

#include <vector> 
#include <string> 

std::vector<std::string> x; 

當我編譯這個用VC++,然後做dumpbin /symbols foo.obj,產量約爲75千字節。儘管我的源代碼似乎只定義了一個符號,但目標文件包含大約180個符號的定義,其中很多與我寫的任何東西幾乎完全無關。

還值得一提的是,如果目標文件是用調試信息編譯的,那麼(通常)也會在目標文件中產生更多的類型信息(以及其他)。

-1

不能有一個標題生成器,因爲.obj文件不包含頭文件中所需的所有信息。至於轉儲.obj,用於執行該操作的工具將依賴於編譯器。與GCC相關的工具是objdump

2

你的問題被標記爲visual-c++所以我假設你在Windows上。

從目標文件中生成原始的頭文件是不可能的,因爲在將源代碼編譯成目標文件時,會丟棄頭文件中很多(可以說是大部分)信息。

但是,您可以使用dumpbin實用程序檢查極低級別的目標文件。對象文件中存在的唯一信息可能對您很有意思,它是在給定對象文件中定義的符號名稱列表。儘管如此,您仍然無法從對象文件中獲取任何類型的信息。所以你不能說出給定的函數使用或期望什麼類型的值。

在某些情況下(當所有的參數都通過堆棧傳遞給函數),你可能知道的一個功能預計參數的數量(通過拆卸功能代碼的開始和計數多少值從彈出堆棧)。但絕大多數情況下這都不起作用。

+0

我不想恢復原始標題。我只是想創建一個基於可以從.obj文件讀取的信息。特別是我想生成函數簽名(返回值,函數名稱,參數)。 dumpbin能做到嗎? – 2010-03-31 14:14:00

+0

@AOI Karasu:我更新了回覆以回答dumpbin是否可以這樣做的問題。 – 2010-03-31 15:57:30