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

.NET Core Linux下bgfx共享库报XLockDisplay未定义符号错误

Linux下.NET Core调用bgfx出现XLockDisplay未定义符号的问题

我最近用C#和.NET Core写了个简单的bgfx应用,在Windows上运行完全正常,但放到Linux上就触发了错误:

/usr/bin/dotnet: symbol lookup error: /home/user/Documents/Projects/GameEngine/GameEngine/bin/Debug/netcoreapp2.0/libbgfx-shared-libDebug.so: undefined symbol: XLockDisplay

我对Linux环境下的C++几乎一窍不通,能想到的办法都试过了,实在找不到解决方向,来求各位大佬给点思路,万分感谢!


参考代码

创建X11窗口的构造函数(能正常打开窗口)

public GameWindow() {
    // (snip)
    XInitThreads();
    dpy = XOpenDisplay(IntPtr.Zero);
    if (dpy == IntPtr.Zero) throw new ApplicationException("XOpenDisplay failed");
    var s = XDefaultScreen(dpy);
    win = XCreateSimpleWindow(dpy, XRootWindow(dpy, s), 10, 10, Width, Height, 1, XBlackPixel(dpy, s), XWhitePixel(dpy, s));
    XSelectInput(dpy, win, XEventMask.ExposureMask | XEventMask.KeyPressMask);
    XMapWindow(dpy, win);
    // (snip)
    WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", false);
    XSetWMProtocols(dpy, win, new[] { WM_DELETE_WINDOW }, 1);
}

创建窗口并分配给bgfx的代码

using (var window = new GameWindow()) {
    Bgfx.SetWindowHandle(window.Handle);
    var inited = Bgfx.Init(); // <- 此代码行导致崩溃
    // (snip)
}

Bgfx.Init()函数实现

public static bool Init (InitSettings settings = null) {
    InitSettings.Native native;
    NativeMethods.bgfx_init_ctor(&native);
    // (snip)
    return NativeMethods.bgfx_init(&native); // <- 此代码行导致崩溃
}

我观察到的现象

  • 官方附带的C示例运行完全正常,只有C#调用时出问题(C示例用的是静态链接库,我在C#中通过PInvoke动态链接)
  • 确定崩溃触发点在glcontext_glx.cpp:66,该行之前的代码都能正常运行:跟踪日志能正常打印,调用bgfx初始化前也能通过C#与库正常交互
  • 有点反常的是,Linux下的libbgfx-shared-libDebug.so(3.6MB)比libbgfx-shared-libRelease.so(5.4MB)小,这和Michael Popoloski提供的Windows版本情况相反(Windows上bgfx.dll 728KB,bgfx_debug.dll 3.5MB)
  • 初始化bgfx前通过C#调用XCreateSimpleWindow()能正常显示窗口,说明X11库已正确链接

我已经尝试过的解决方法

  • 改用Michael Popoloski的bgfx分支编译libbgfx-shared-libDebug.so,问题没有变化
  • 替换为release版本的库,错误依旧存在
  • 用readelf -d libbgfx-shared-libDebug.so检查X11是否为静态依赖,结果显示不是
  • 通过/proc/1234/maps检查共享X11库的加载情况,确认我的C#测试程序和C++示例加载的是同一个库
  • 不使用调试器直接运行.NET Core程序,没有任何变化
  • 用LD_PRELOAD和LD_LIBRARY_PATH强制预加载libbgfx-shared-libDebug.so,没有效果
  • 注释glcontext_glx.cpp:66的问题代码并重新编译,错误从undefined symbol: XLockDisplay变成了undefined symbol: glXQueryVersion(即下一行调用的函数)
  • 向编译器添加-lm -lpthread -lX11编译选项,问题仍未解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:27