鉴于生成obj文件的标题
-
23-09-2019 - |
题
有一种方法来产生用于一个obj文件一个C ++头文件?或者,也许是有可以查看.obj文件的工具。我已经发现objconv该格式之间进行转换,但我找不到任何.H生成器/浏览器。
解决方案
鉴于C ++代码,情况是不太无望一些其他的答案的暗示。
在特别是,至少大部分C ++编译器,一个函数的名称,将被截断(微软称之为“修饰”),以指示由该函数所采取的参数。该重整方案变化从一个编译器到另一个,但本质上它们中的任何编码足够的信息,为您重新创建该函数的声明 - 返回类型,函数本身的名称,如果它的类名称的成员函数和确切的数量和参数类型的函数的期望。
虽然就不必通过重整的名称来进行,一个C ++系统没有真正的选择,但可以包括在对象文件中的参数信息。当重载函数,链接器需要一些方法来整理出与特定呼叫连接起来,其过载。
我要补充一点,整理出这一切可能是相当多的工作中,虽然 - 只是举例,如果代码包括模板,在目标文件中的符号名称将拓展出的所有的了模板参数(包括默认参数)。只是举例,考虑这样的代码一个微不足道的位:
#include <vector>
#include <string>
std::vector<std::string> x;
当我用VC编译这个++,然后做dumpbin /symbols foo.obj
,输出为约75千字节。虽然我的源代码只出现来定义一个符号,对象文件中包含的定义为大约180符号,很多人几乎完全无关的任何事情我都写了。
这也是值得一提的是,如果对象文件用调试信息编译,这将(通常)产生对象文件,以及在实质上更多类型信息(并且这样的)。
其他提示
所以我假设你在Windows上你的问题被打上visual-c++
。
生成原始标题的对象文件的文件掉,因为在头文件中的信息多少(可以说大多数)而将源代码编译成目标文件被丢弃是不可能的。
不过,您可以使用dumpbin
工具在一个非常低的水平,以检查对象文件。存在于可能是有趣的,你的目标文件的唯一信息是在给定的目标文件中定义的符号名称的列表。你不能从对象文件虽然任何类型的信息。所以,你不能告诉一个给定的功能需要或期望什么类型的值。
在某些情况下(当所有的参数都通过堆栈传递给函数),你可能知道的一个功能希望(通过拆卸功能代码的开始和计数多少值从栈中弹出的参数个数)。这在绝大多数虽然情况下将无法工作。
有不能是一个标头发生器,作为obj文件不包含将需要在头文件中的所有信息。至于倾销OBJ,该工具做,这将是依赖于编译器。该GCC相关工具做,这是 objdump的。