You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

i686-w64-mingw32-g++链接JWASM生成的.obj文件失败求助

解决链接失败的步骤

1. 修改汇编代码,适配MinGW链接规则

调整库引用与入口标记

MinGW链接器无法识别MASM32带路径的库指令,且原代码缺少入口点标记、栈平衡代码,修改后代码如下:

.686
.xmm
.model flat, stdcall
OPTION CaseMap:None

include windows.inc
include kernel32.inc
include user32.inc
; 改用MinGW自带系统库,无需指定路径
includelib kernel32.lib
includelib user32.lib
includelib msvcrt.lib

EXTERN printf:PROC

.data
    string1 db "Prova Prova Prova",0

.code

main PROC
    push ebp
    mov ebp,esp

    mov eax, offset string1
    push eax

    call printf

    ; printf是*cdecl调用约定*,调用后需手动平衡栈(调用者清理参数)
    add esp,4  

    pop ebp
    ret
main ENDP
END main  ; 指定入口点为main,让汇编器标记正确的入口

2. 使用正确的链接命令

原命令未明确指定控制台程序类型,导致链接器寻找GUI入口WinMain@16,改用以下命令之一:

  • 用GCC链接控制台程序:
i686-w64-mingw32-gcc -m32 printf.o -o printf.exe -lmsvcrt
  • 用G++链接并指定控制台类型:
i686-w64-mingw32-g++ -m32 -mconsole printf.o -o printf.exe -lmsvcrt

错误原因说明

  • .drectve警告:JWasm生成的带相对路径的默认库指令是MASM工具链专属格式,MinGW的ld链接器无法识别,改用MinGW自带库即可消除。
  • undefined reference to WinMain@16:MinGW默认未指定-mconsole时会按GUI程序链接,寻找WinMain@16;同时原代码END未指定入口点,导致.obj文件无正确入口标记,添加END main可解决。
  • 栈平衡问题:printf采用cdecl调用约定,调用者需手动清理栈上的参数,否则程序运行会因栈崩溃。

内容的提问来源于stack exchange,提问作者I_4m_Z3r0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:03:38