有没有办法为.obj文件生成c ++头文件?或者可能有一个可以查看.obj文件的实用程序。我已经找到了在格式之间转换的objconv,但我找不到任何.h生成器/查看器。
答案 0 :(得分:4)
鉴于C ++标签,情况并不像其他一些答案所暗示的那样毫无希望。
特别是,至少在大多数C ++编译器中,函数的名称将被修改(Microsoft称之为“装饰”)以指示该函数所采用的参数。修改方案因编译器而异,但基本上它们中的任何一个都会编码足够的信息,以便为函数重新创建声明 - 返回类型,函数本身的名称,类名称(如果它是成员函数) ,以及函数所需的参数的确切数量和类型。
虽然不必通过修改名称来完成,但C ++系统没有真正的选择,只能在参数文件中包含参数信息。当您重载函数时,链接器需要一些方法来整理与特定调用链接的重载。
我应该补充一点,排除这一切可能是相当多的工作 - 例如,如果代码包含模板,目标文件中的符号名称将展开 all 模板参数(包括默认参数)。例如,考虑一下这样简单的代码:
#include <vector>
#include <string>
std::vector<std::string> x;
当我使用VC ++编译它,然后执行dumpbin /symbols foo.obj
时,输出大约是75千字节。尽管我的源代码似乎只定义了一个符号,但是目标文件包含大约180个符号的定义,其中许多符号几乎与我写的任何内容完全无关。
还值得一提的是,如果目标文件是使用调试信息编译的,那么(通常)也会在目标文件中产生更多的类型信息(等等)。
答案 1 :(得分:2)
您的问题已标记为visual-c++
,因此我假设您使用的是Windows。
从目标文件中生成原始头文件是不可能的,因为在将源代码编译为目标文件时,会删除头文件中的大部分(可以说是大多数)信息。
但是,您可以使用dumpbin
实用程序以非常低的级别检查目标文件。目标文件中唯一可能感兴趣的信息是给定目标文件中定义的符号名称列表。但是,您无法从目标文件中获取任何类型信息。因此,您无法确定给定函数的值或期望值。
在某些情况下(当所有参数都通过堆栈传递给函数时)你可能会告诉函数所期望的参数数量(通过反汇编函数代码的开头并计算从堆栈中弹出多少个值) )。但这绝不会在绝大多数情况下起作用。
答案 2 :(得分:-1)
不能有标头生成器,因为.obj文件不包含头文件中必需的所有信息。至于转储.obj,执行此操作的工具将依赖于编译器。与此相关的GCC相关工具是objdump。