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

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官方文档不足,求排查可能原因。


可能的排查方向

  1. C/C++名字修饰不兼容
    luau_compile大概率是C语言实现的,但你的代码在C++文件中编译。检查Luau的Compiler.h是否用extern "C"包裹了函数声明,如果没有,在cpp文件中引用头文件时需要手动添加:

    extern "C" {
    #include "../../libs/luau/include/Compiler.h"
    }
    

    C++会对函数名做特殊修饰,而C不会,这是导致符号找不到的常见原因。

  2. 静态库链接顺序错误
    链接器按从左到右的顺序处理库,依赖库必须放在被依赖库的后面。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.a
    
  3. Luau编译时未包含目标函数
    用nm命令检查libLuau.Compiler.a中是否存在luau_compile符号:

    nm libs/luau/libLuau.Compiler.a | grep luau_compile
    

    如果没有找到,说明编译Luau时这个函数没被编译进库,需要调整CMake配置(比如是否关闭了相关编译选项)。

  4. 函数签名不匹配
    核对Compiler.h中luau_compile的声明和你代码中的调用是否完全一致:

    • 参数类型是否匹配(比如size_t和unsigned long的平台差异)
    • 是否遗漏const修饰符(比如函数要求const lua_CompileOptions*,但你传递的是非const指针)
  5. 冗余或缺失依赖库
    libisocline.a如果不是当前代码的必要依赖,可以尝试移除;同时检查Luau编译时是否有其他隐性依赖库未加入链接命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:03:36