.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
相关产品推荐
相关产品推荐

