Luau集成游戏时遇luau_compile未定义引用错误求助
自定义编译Luau集成游戏时链接错误排查
编译Luau的步骤
mkdir build && cd build cmake .. make
编译完成后得到以下静态库文件:
- libLuau.VM.a
- libLuau.Compiler.a
- libLuau.CodeGen.a
- libLuau.Ast.a
- libLuau.Analysis.a
项目构建脚本
game = another game engine_files = src/engine.c src/error/error_handler.cpp src/renderer/opengl.cpp imgui_files = src/renderer/ui/imgui/*.cpp luau = -Llibs/luau/ -l:libLuau.Ast.a -l:libLuau.Analysis.a -l:libisocline.a -l:libLuau.CodeGen.a -l:libLuau.Compiler.a -l:libLuau.VM.a build: g++ src/scripting/luau_integration.cpp $(engine_files) -std=c++17 -Wl,-rpath -Wl,'\$\$ORIGIN' glad.c -lm -lglfw3 -lGL -lwebp -lXrandr -lXinerama -lX11 -ldl -pthread -o bin/$(game) -L./ -l:imgui.so $(luau) export LD_LIBRARY_PATH=./ && cd bin && ./confidental name removed
相关代码文件
luau_integration.hpp
/* You are granted license to view these files, modify them, study them they are not under cc by sa though*/ namespace Scripting{ class Lua{ public: static void Integrate(); }; }
luau_integration.cpp
// public domain // This loads game scripts #include "../../libs/luau/include/Compiler.h" #include "../../libs/luau/include/BytecodeBuilder.h" #include "../../libs/luau/include/StringUtils.h" #include "luau_integration.hpp" #include "../../libs/luau/include/lua.h" #include "../../libs/luau/include/luacode.h" #include "../../libs/luau/include/lualib.h" #include "../../libs/luau/include/StringUtils.h" #include "../../libs/luau/include/BytecodeBuilder.h" struct lua_CompileOptions options; void Scripting::Lua::Integrate () { size_t binarySize; luau_compile("print(\"e\")", 11, &options, &binarySize); }
链接器错误信息
/usr/bin/ld: /tmp/cc8XT3MW.o: in function `Scripting::Lua::Integrate()': luau_integration.cpp:(.text+0x23): undefined reference to `luau_compile(char const*, unsigned long, lua_CompileOptions*, unsigned long*)'
问题说明
已确认Luau头文件和库文件路径正确,但链接器始终报上述未定义引用错误,Luau官方文档不足,求排查可能原因。
可能的排查方向
C/C++名字修饰不兼容
luau_compile大概率是C语言实现的,但你的代码在C++文件中编译。检查Luau的Compiler.h是否用extern "C"包裹了函数声明,如果没有,在cpp文件中引用头文件时需要手动添加:extern "C" { #include "../../libs/luau/include/Compiler.h" }C++会对函数名做特殊修饰,而C不会,这是导致符号找不到的常见原因。
静态库链接顺序错误
链接器按从左到右的顺序处理库,依赖库必须放在被依赖库的后面。luau_compile属于libLuau.Compiler.a,但它可能依赖其他Luau库,调整链接顺序为依赖倒序:luau = -Llibs/luau/ -l:libLuau.Compiler.a -l:libLuau.CodeGen.a -l:libLuau.Ast.a -l:libLuau.Analysis.a -l:libLuau.VM.a -l:libisocline.aLuau编译时未包含目标函数
用nm命令检查libLuau.Compiler.a中是否存在luau_compile符号:nm libs/luau/libLuau.Compiler.a | grep luau_compile如果没有找到,说明编译Luau时这个函数没被编译进库,需要调整CMake配置(比如是否关闭了相关编译选项)。
函数签名不匹配
核对Compiler.h中luau_compile的声明和你代码中的调用是否完全一致:- 参数类型是否匹配(比如
size_t和unsigned long的平台差异) - 是否遗漏
const修饰符(比如函数要求const lua_CompileOptions*,但你传递的是非const指针)
- 参数类型是否匹配(比如
冗余或缺失依赖库
libisocline.a如果不是当前代码的必要依赖,可以尝试移除;同时检查Luau编译时是否有其他隐性依赖库未加入链接命令。
内容的提问来源于stack exchange,提问作者drk1
相关产品推荐
相关产品推荐

