3

我需要将 64 位 .lib 文件COFFOMF. Coff2Omf.exe与 32 位库一起工作正常,但给...

ERROR: COFF error: FOOx64.lib
(coffread.cpp, 1637) : invalid machine type detected

...在 64 位库上。是否有用于此的更新工具或类似工具?

4

2 回答 2

2

根据 Embarcadero 的文档:

基于 Clang 的 C++ 编译器与上一代 C++ 编译器之间的差异

对象和库文件格式

  • BCC32 及其相关工具在 .obj 和 .lib 文件中使用 OMF。
  • 基于 Clang 的 C++ 编译器在 .o 和 .a 文件中使用 ELF。

这种差异意味着,例如,当您迁移 32 位 Windows 应用程序时,您必须将对 .lib 和 .obj 文件的引用分别更改为 .a 和 .o。

BCC64.EXE,C++ 64 位 Windows 编译器

编译后的目标文件
ELF64 格式

#pragma 链接

只要您使用默认文件类型,就不要指定模块名的文件扩展名 (.ext)。链接器假定 modulename 的文件扩展名 (.ext) 具有以下默认值:

  • .objBCC32 扩展
  • .o扩展:
    基于 Clang 的 C++ 编译器
    BCCOSX

因此,如果您省略.ext,则会根据您当前的目标平台自动使用正确的扩展名。

OMF 仅由 32 位编译器/链接器使用。64 位编译器/链接器使用 ELF64 代替。

于 2015-06-30T18:17:25.177 回答
1

我想知道 OMF 规范是否曾经存在于 64 位架构。顺便问一下,为什么需要 64 位 OMF 文件?C++Builder 上的 64 位版本基于 LLVM 编译器后端,它生成 ELF 对象文件(据我所知)

我不知道 coff2elf 之类的东西是否与 C++Builder XE7 捆绑在一起,但是,也许你可以使用开源工具,比如“对象文件转换器”,在这里寻找它: http ://www.agner.org/optimize /#objconv

于 2015-06-30T05:03:04.190 回答