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

Windows下GCC转换NASM生成的.o为.exe报错:未定义WinMain@16求助

问题定位

错误提示undefined reference to WinMain@16的核心原因是:

  • MinGW的GCC在Windows环境下默认将程序视为GUI应用,自动查找WinMain@16作为入口函数;
  • 你的汇编代码既没有定义符合规范的WinMain@16入口,也没有定义控制台程序的标准入口main,导致链接器找不到程序启动的入口点。
解决方案

根据你开发的程序类型(控制台/GUI),选择对应方案:

方案1:开发控制台程序

步骤1:修改汇编代码,定义全局main入口

在.asm文件中添加全局入口声明并实现main函数:

global main

section .text
main:
    ; 编写你的控制台程序逻辑
    ret  ; 退出程序

步骤2:重新编译链接

执行以下命令重新生成可执行文件:

nasm -f elf test.asm
gcc test.o

执行完成后会生成默认的a.exe,直接运行即可。

方案2:开发GUI程序

步骤1:修改汇编代码,定义WinMain@16入口

GUI程序需要遵循Windows入口规范,定义WinMain@16(WinMain包含4个参数,共占用16字节栈空间):

global WinMain@16

section .text
WinMain@16:
    ; 编写你的GUI程序逻辑(如调用Windows API创建窗口)
    ret 16  ; 清理16字节参数栈空间后返回

步骤2:重新编译链接

执行原命令即可生成GUI程序:

nasm -f elf test.asm
gcc test.o

方案3:使用自定义入口(如_start)

如果习惯用传统的_start作为入口,可通过GCC参数指定链接器忽略默认启动文件并指定入口:

步骤1:修改汇编代码,定义全局_start

global _start

section .text
_start:
    ; 编写你的程序逻辑
    ; 最后调用ExitProcess退出(需导入kernel32.dll)
    push 0
    call [ExitProcess]

步骤2:编译链接时指定参数

nasm -f elf test.asm
gcc -nostartfiles -e _start test.o -lkernel32
  • -nostartfiles:告诉GCC不要链接默认启动代码
  • -e _start:指定程序入口为_start
  • -lkernel32:链接kernel32.dll,提供ExitProcess等系统调用

额外提示

若想生成Windows原生PE格式的目标文件,可将NASM编译参数改为-f win32,效果与-f elf一致但更适配Windows环境:

nasm -f win32 test.asm

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:03:42