我不小心刪除了一個我沒有添加到版本控制中的.h文件,但我仍然有.h.gch。有什麼辦法可以解壓縮.gch嗎?不能編譯gch文件
9
A
回答
2
這可能是不可能的。編譯通常是單向過程;一旦你這樣做了,就沒有辦法重建你的初始源代碼,並且變量名稱,註釋甚至某些子例程等內容都將被內聯和解決。這同樣適用於預編譯頭文件,因此不可能有任何好的方法來重建.gch文件中的文檔和名稱。你也許可以在標題中重新構建一些版本的名字,但是這又會和你已有的名字沒有什麼不同。除非你有備份,否則你幾乎沒有運氣。
1
AFAIK gch
文件是處理標頭後編譯器內存的某種轉儲(至少就其涉及的IR中涉及的數據結構而言);也許原始標題中包含的很多信息仍然以某種形式出現,但我認爲沒有提取它的工具。
2
您可以嘗試運行strings
實用程序。 GCH定義了很多內部的gcc宏觀的,所以我建議你做兩個垃圾場處理字符串:
首先是你的GCH:$ strings file.h.gch
和第二是預編譯空的頭文件(或者,如果你能記住,什麼納入你的頭 - 包括在該文件中太)
然後你就可以節省轉儲和做一個diff運行:
在我的例子:
#define d1234
#undef dsgf
int asdfgh(char a);
int ghjkl(int g, int h);
中有差異,在最頂端的所有名稱:
1074a1075
> asdfgh
1189a1191
> d1234
1200a1203
> dsgf
1287a1291
> ghjkl
如何獲得結構和職能時的參數,我不知道。 但我建議如果你可以使用這個pch(例如用#pragma GCC pch_preprocess "file.h.gch"
代替#include "file.h"
) - 那麼你可以用-fdump-tree-all-all
和-frtl-dump-all-all
做一個樹和rtl轉儲。一些轉儲將包含更多信息,來自丟失的標題。
相關問題
- 1. Maven的POM不能編譯文件
- 2. Flash ActionScript文件突然不能編譯?
- 3. 不能編譯LESS文件導入CSS
- 4. 鴕鳥不能編譯配置文件
- 5. NHibernate的 - 不能編譯映射文件
- 6. 編譯或不編譯.class文件
- 7. 編譯rpm而不編譯源文件
- 8. 不能編譯MOC文件:頭文件不包含<QObject>
- 9. 文件不會編譯name.java
- 10. Runtime.exec不編譯java文件
- 11. 不要編譯t4文件
- 12. Make不編譯好文件
- 13. CSHTML文件不再編譯
- 14. 類文件不能在App_Code文件夾之外編譯
- 15. 編譯RSweave文件:文件不是ASCII
- 16. 不能編譯QtCreator
- 17. 不能編譯C++
- 18. 鐺不能編譯
- 19. 不能編譯malloc__hooks
- 20. 不能編譯WordCount.java
- 21. 不能編譯鏽
- 22. ffmpeg的編譯不能編譯
- 23. 你不能在編譯環境以外編譯TopCoder,java不能編譯
- 24. visual-studio-2015 Typescript編譯器不能從外部編譯d.ts文件libarry
- 25. 在編譯文件中編譯類
- 26. 編譯和反編譯dll文件
- 27. 用C++編譯器編譯C99文件
- 28. 編譯兩個c文件不能正常工作,找不到頭文件
- 29. 在編譯文件後編輯文件
- 30. C#編譯智能編譯
我認爲這在技術上可能是可能的,因爲'gch'文件似乎是一種「二進制頭文件」,而不是真正「編譯」的東西。預編譯頭文件包含以前在頭文件中的所有信息,例如預編譯頭文件中的宏/常量'#define'-d就像包含頭文件一樣。好消息是這麼多。對於壞消息,我不相信存在一種扭轉這一過程的工具。如果有的話,由於不同的二進制表示形式,它也必須適應_exact_編譯器版本。 – Damon