Windows下C++结合x64汇编编译提示目标文件格式不识别如何解决
64位程序编译失败解决方案
问题核心原因
- 当前使用的
MinGW.org GCC-6.3.0-1是早已停止维护的32位专属GCC工具链,本身不支持识别64位COFF格式目标文件,也不具备生成64位Windows程序的能力,直接触发File format not recognized链接错误。 - 现有汇编代码的符号命名遵循32位Windows C语言规则(函数名前置下划线
_),64位Windows平台下C外部符号默认不带前置下划线,即便换对工具链也会触发“未定义引用”的符号找不到错误。
具体操作步骤
- 替换编译工具链
卸载现有老旧MinGW版本,安装x86_64架构的MinGW-w64工具链(目前Windows平台下最通用的64位GCC编译环境)。安装完成后在终端执行g++ --version,输出内容包含x86_64相关标识即为安装成功。 - 修正汇编代码
调整asm.asm的符号定义,去掉函数名前的前置下划线;由于returnnum返回值是32位int类型,使用eax寄存器存返回值更符合64位调用约定规范(CPU写入eax时会自动清零rax高32位,不存在值溢出问题),修正后代码如下:segment .text global returnnum returnnum: mov eax, 420 ret若直接写入
rax寄存器也可运行,但对32位int返回值属于冗余操作。
原有cpp.cpp代码无需修改,extern "C"的声明符合C符号链接规则。 - 执行编译命令
首先用NASM编译汇编文件,生成64位Windows目标文件:
再用64位g编译C代码并链接汇编目标文件,生成64位可执行程序:nasm -f win64 asm.asm -o asm.obj
运行生成的g++ cpp.cpp asm.obj -o main.exemain.exe即可正常输出420。
内容的提问来源于stack exchange,提问作者avighnac
相关产品推荐
相关产品推荐

