调用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声明和调用语句:
cdecl约定下,调用者需要清理栈,你代码里的extern _InitWindow ; ... call _InitWindowadd esp,12是正确的。 - MSVC编译的raylib:采用stdcall调用约定,函数名会带有
@参数字节数后缀,InitWindow有3个4字节参数,所以函数名是_InitWindow@12。此时汇编代码要修改为:
stdcall约定下,被调用者会自动清理栈,所以要删掉extern _InitWindow@12 ; ... call _InitWindow@12add 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
相关产品推荐
相关产品推荐

