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