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
相关产品推荐
相关产品推荐

