E2045 错误的对象文件格式:“XXX.obj”
Posted
技术标签:
【中文标题】E2045 错误的对象文件格式:“XXX.obj”【英文标题】:E2045 Bad object file Format:"XXX.obj" 【发布时间】:2017-10-16 11:07:52 【问题描述】:我正在处理一个从x32
位到x64
的迁移项目。
这里我使用这个代码:
$L com_1.obj
$L com_is1.obj
$L com_2.obj
但是在编译代码时出现错误
[dcc64 Error] XXX.dpr(919): E2045 Bad object file format: 'E:\MyProj\com_sha.obj'
我无法追踪它发生的原因。
是不是因为 32 位 obj 文件用于编译 x64 位 delphi 项目?
如果是,我也尝试使用 x64 位环境创建 obj 文件。
谁能帮我解决这个问题?
我正在使用Delphi 10 Seattle
。
【问题讨论】:
我的文章的无耻插件:rvelthuis.de/articles/articles-cobjs.html 这应该解释它。不,您不能在 64 位程序中使用 32 位 obj 文件。文章还展示了如何处理不满意的转发。 FWIW,尝试将单位 System.Win.Crtl(注意:C-R-T-L,而不是 C-T-R-L)添加到您的代码中。这应该会照顾到许多不满意的前锋。 这是我的下一个问题***.com/q/44020038/3110262 【参考方案1】:您不能将 32 位对象与 64 位编译器一起使用。您必须使用 64 位编译器重新编译您的代码。
您可以使用许多不同的编译器来执行此操作。虽然我听说有人使用 gcc 取得了成功,但我从来没有成功过。我相信可以使用基于现代 Clang 的 Embarcadero 编译器,但我个人没有这方面的经验。我一直使用 Microsoft 编译器来创建 64 位对象。当然,这就是 Embarcadero 自己为链接到 RTL 的 zlib 之类的库所做的。
【讨论】:
我使用 Visual C++ Express 创建了一个 64 位 obj 文件。但没有运气。我在 obj 文件中遇到了同样的错误。 很明显,您周围有一些错误的对象。请注意,报告的错误是针对不在您的列表中的对象。回到基础。向自己证明您可以链接到一个简单的函数,该函数将两个 int 值相加并返回结果。从那里开始工作。这是调试101。简化为你能理解的问题。然后应用于真正的、更复杂的问题。 这是一个不同的问题。我确实知道如何处理这些问题。但不是在这个问题上。 不要将文件编译为 C++ 目标文件。尝试将它们编译为 C 目标文件。这些目标文件是什么格式的?存在几种不兼容的格式。 @Rudy 不,不是这样。堆栈检查可以通过编译器开关来抑制。__imp_XXX
的存在意味着使用运行时链接进行编译。我的猜测是,asker 是在 VS GUI 中完成所有这些操作,而不是使用 cl
。我到cl
的命令行如下所示:cmd = '"%(cl)s" /I "%(include)s" /c /wd4090 /wd4700 /O2 /GS- /Gs131072 /Fo%(outdir)s/ %(cmd)s' % locals()
显然这是带有一些替代的 Python 代码,但您应该能够理解。【参考方案2】:
是的,您需要将那些 .obj
文件转换为 64 位。
Converting 32-bit Delphi Applications to 64-bit Windows 状态:
64 位外部 .obj 文件:如果您希望 64 位 Windows 应用程序链接到外部 .obj 文件,请记住您需要 64 位版本的 .obj 文件与 64 位 Windows 应用程序链接。
【讨论】:
正如我和@David 的回答中所说,使用 64 位编译器创建 64 位 .obj 文件。以上是关于E2045 错误的对象文件格式:“XXX.obj”的主要内容,如果未能解决你的问题,请参考以下文章
C语言问题,vs2013“已经在xxx。obj中定义”怎么解决
VC中编译出现error LNK2005:xx already defined in xxx.obj问题解决。