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

调用raylib库的汇编程序编译时出现未定义引用错误求助

汇编调用raylib的InitWindow函数出现未定义引用问题

问题详情

我尝试用x86汇编调用raylib库的InitWindow函数,编写的代码如下:

global _main

extern InitWindow
extern _ExitProcess@4

section .data
    title db "Window Title",0

section .text

_main:
    push title
    push 600
    push 800
    call InitWindow
    add esp, 12

    push 0
    call _ExitProcess@4

使用以下命令编译链接:

nasm -f win32 example.asm -o example.o
gcc example.o -o example.exe -lraylib -lopengl32 -lgdi32 -lwinmm

但编译时始终抛出错误:

example.o:example.asm:(.text+0x10): undefined reference to `InitWindow'
collect2.exe: error: ld returned 1 exit status

试过修改函数名为_InitWindow@12或_InitWindow,也尝试直接指定raylib目录路径链接,都无法解决问题。

解决方法

1. 确认raylib库的调用约定与函数名修饰

raylib在Windows下的函数名修饰取决于编译工具链:

  • MinGW编译的raylib:C函数会自动添加_前缀,调用约定为cdecl,函数名应为_InitWindow。此时汇编代码中要修改extern声明和调用语句:
    extern _InitWindow
    ; ...
    call _InitWindow
    
    cdecl约定下,调用者需要清理栈,你代码里的add esp,12是正确的。
  • MSVC编译的raylib:采用stdcall调用约定,函数名会带有@参数字节数后缀,InitWindow有3个4字节参数,所以函数名是_InitWindow@12。此时汇编代码要修改为:
    extern _InitWindow@12
    ; ...
    call _InitWindow@12
    
    stdcall约定下,被调用者会自动清理栈,所以要删掉add esp,12这行。

2. 确保链接时能找到raylib库

  • 如果raylib库不在系统默认库路径,需要用-L参数指定库所在目录,比如:
    gcc example.o -o example.exe -L./raylib/lib -lraylib -lopengl32 -lgdi32 -lwinmm
    
  • 确认使用的raylib库是32位版本(因为你用nasm -f win32编译的是32位目标文件,必须链接32位库)。

3. 验证库中的函数符号

用nm工具查看raylib库的符号表,确认InitWindow的正确名称:

nm libraylib.a | grep InitWindow

根据输出的符号名,修改汇编代码中的extern声明和调用语句即可。

内容的提问来源于stack exchange,提问作者Hüse 64

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:50:07