2010-03-31 41 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