有沒有辦法爲.obj文件生成C++頭文件?或者也許有一個實用程序可以查看.obj文件。我已經找到了在各種格式之間轉換的objconv,但我找不到任何.h生成器/查看器。生成視圖.obj文件的標頭
回答
鑑於C++標記,情況並不像其他答案暗示的那樣絕望。
特別是,至少在大多數C++編譯器中,函數的名稱會被損壞(Microsoft稱之爲「裝飾」),以指示該函數所採用的參數。編譯方案因編譯器而異,但實際上它們中的任何一個都編碼足夠的信息,以便爲函數重新創建聲明 - 返回類型,函數本身的名稱,類名稱(如果它是成員函數) ,以及函數期望的參數的確切數量和類型。
儘管不必通過重寫名稱來完成,但C++系統沒有真正的選擇,只能將參數信息包含在目標文件中。當你重載函數時,鏈接器需要一些方法來確定哪個超載與特定的調用相關聯。
我要補充一點,整理出這一切可能是相當多的工作中,雖然 - 只是舉例,如果代碼包括模板,在目標文件中的符號名稱將拓展出所有模板參數(包括默認參數)。只是舉例,考慮代碼瑣碎有點像這樣:
#include <vector>
#include <string>
std::vector<std::string> x;
當我編譯這個用VC++,然後做dumpbin /symbols foo.obj
,產量約爲75千字節。儘管我的源代碼似乎只定義了一個符號,但目標文件包含大約180個符號的定義,其中很多與我寫的任何東西幾乎完全無關。
還值得一提的是,如果目標文件是用調試信息編譯的,那麼(通常)也會在目標文件中產生更多的類型信息(以及其他)。
不能有一個標題生成器,因爲.obj文件不包含頭文件中所需的所有信息。至於轉儲.obj,用於執行該操作的工具將依賴於編譯器。與GCC相關的工具是objdump。
你的問題被標記爲visual-c++
所以我假設你在Windows上。
從目標文件中生成原始的頭文件是不可能的,因爲在將源代碼編譯成目標文件時,會丟棄頭文件中很多(可以說是大部分)信息。
但是,您可以使用dumpbin
實用程序檢查極低級別的目標文件。對象文件中存在的唯一信息可能對您很有意思,它是在給定對象文件中定義的符號名稱列表。儘管如此,您仍然無法從對象文件中獲取任何類型的信息。所以你不能說出給定的函數使用或期望什麼類型的值。
在某些情況下(當所有的參數都通過堆棧傳遞給函數),你可能知道的一個功能預計參數的數量(通過拆卸功能代碼的開始和計數多少值從彈出堆棧)。但絕大多數情況下這都不起作用。
- 1. 從目標文件生成頭文件
- 2. 當Visual Studio生成32位.obj文件和64位.obj文件?
- 3. 探索由VC++生成的.obj文件
- 4. 什麼是obj文件夾生成?
- 5. 如何爲新視圖自動生成實現和頭文件?
- 6. JNI頭文件生成類
- 7. Drupal視圖:生成xml文件
- 8. Obj-C++頭文件中的AppKit對象?
- 9. Qt Vs addin - .obj文件不生成moc _ *。cpp文件
- 10. C庫,生成文件頭的依賴
- 11. 生成java頭文件的錯誤
- 12. 使用Cython生成的頭文件
- 13. 在MIDL生成的頭文件
- 14. 生成Java頭文件中的錯誤
- 15. 更改IDL生成的頭文件
- 16. HTTP:生成ETag標頭
- 17. 如何生成帶有適當CGI標頭的XML文件?
- 18. qmake:將uic生成的頭文件添加到安裝目標
- 19. 生成有效的ETAG文件流並與標頭比較
- 20. 麻煩爲JNI生成頭文件
- 21. 如何自動生成C++頭文件
- 22. 在MVC中生成SOAP頭文件C#
- 23. 使用TFS生成版本頭文件
- 24. 在Twisted客戶端生成頭文件
- 25. 從C++頭文件生成Java接口
- 26. 生成JNI頭文件時出錯
- 27. Bazel頭文件代碼生成器
- 28. 從頭自動生成C++文件?
- 29. pvrtextool cl不生成標準標頭
- 30. 用空文件生成頭文件和尾部文件
我不想恢復原始標題。我只是想創建一個基於可以從.obj文件讀取的信息。特別是我想生成函數簽名(返回值,函數名稱,參數)。 dumpbin能做到嗎? – 2010-03-31 14:14:00
@AOI Karasu:我更新了回覆以回答dumpbin是否可以這樣做的問題。 – 2010-03-31 15:57:30