我试图在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
我对C ++一无所知(特别是在Linux上),我已经尝试了所有我能想到的东西。我正在寻找解决这个问题的提示。 非常感谢,感谢您的帮助。
This是我用来创建新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);
}
This是我创建窗口并将其分配给bgfx的地方。
using (var window = new GameWindow())
{
Bgfx.SetWindowHandle(window.Handle);
var inited = Bgfx.Init(); // <- this line causes the crash
// (snip)
}
This是Bgfx.Init()
函数。
public static bool Init (InitSettings settings = null) {
InitSettings.Native native;
NativeMethods.bgfx_init_ctor(&native);
// (snip)
return NativeMethods.bgfx_init(&native); // <- this line causes the crash
}
包含的C ++示例运行正常,我只是遇到来自C#的这个问题(虽然库在C ++示例中是静态链接的;我是从C#动态链接PInvoke)。 / p>
我发现了从glcontext_glx.cpp:66触发的崩溃。这行之前的所有代码确实都运行了(我检查了tracelogs,它们实际上是打印出来直到崩溃,我在成功调用之前以其他方式成功地与C#进行了交互)。
奇怪的是, libbgfx-shared-libDebug.so (3.6MB)的重量小于 libbgfx-shared-libRelease.so (5.4MB)。 Windows build by Michael Popoloski( bgfx.dll 728KB和 bgfx_debug.dll 3.5MB)的情况恰恰相反。
我在初始化bgfx之前从C#做XCreateSimpleWindow()
,窗口确实出现了,因此X11库实际上是正确链接的。
readelf -d libbgfx-shared-libDebug.so
检查库以查看X11是否标记为静态依赖项 - 它不是/proc/1234/maps
检查已加载共享X11库 - 在我的C#测试和附带的C ++示例中加载了相同的库LD_PRELOAD
和LD_LIBRARY_PATH
强制预加载 libbgfx-shared-libDebug.so 库 - 无需更改undefined symbol: XLockDisplay
更改为undefined symbol: glXQueryVersion
,在下一行中调用-lm -lpthread -lX11
标志(suggested为jdweng) - 不再打印该错误行,但在调用XLockDisplay
时程序仍然崩溃< / LI>
libbgfx-shared-libDebug.so 的静态依赖关系:
user@ASUS-MINT ~/Documents/Projects/GameEngine/GameEngine/bin/Debug/netcoreapp2.0 $ readelf -d libbgfx-shared-libDebug.so
Dynamic section at offset 0x1571d0 contains 28 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [librt.so.1]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2]
(snip)
运行我的代码时 dotnet 的地图:
user@ASUS-MINT ~ $ cat /proc/32502/maps
00400000-00418000 r-xp 00000000 08:06 185073 /usr/share/dotnet/dotnet
(snip)
7fe844bed000-7fe844d42000 r-xp 00000000 08:06 1616067 /home/user/Documents/Projects/GameEngine/GameEngine/bin/Debug/netcoreapp2.0/libbgfx-shared-libDebug.so
7fe844d42000-7fe844f42000 ---p 00155000 08:06 1616067 /home/user/Documents/Projects/GameEngine/GameEngine/bin/Debug/netcoreapp2.0/libbgfx-shared-libDebug.so
7fe844f42000-7fe844f45000 r--p 00155000 08:06 1616067 /home/user/Documents/Projects/GameEngine/GameEngine/bin/Debug/netcoreapp2.0/libbgfx-shared-libDebug.so
7fe844f45000-7fe844f4d000 rw-p 00158000 08:06 1616067 /home/user/Documents/Projects/GameEngine/GameEngine/bin/Debug/netcoreapp2.0/libbgfx-shared-libDebug.so
(snip)
7fe8455aa000-7fe8456df000 r-xp 00000000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fe8456df000-7fe8458df000 ---p 00135000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fe8458df000-7fe8458e0000 r--p 00135000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7fe8458e0000-7fe8458e4000 rw-p 00136000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
(snip)
包含C ++示例的地图(不参考 libbgfx-shared-libDebug.so ):
user@ASUS-MINT ~ $ cat /proc/351/maps
00400000-007fe000 r-xp 00000000 08:06 1607279 /home/user/bgfx/bgfx/.build/linux64_gcc/bin/examplesDebug
(snip)
7f6ad126c000-7f6ad13a1000 r-xp 00000000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7f6ad13a1000-7f6ad15a1000 ---p 00135000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7f6ad15a1000-7f6ad15a2000 r--p 00135000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
7f6ad15a2000-7f6ad15a6000 rw-p 00136000 08:06 2370342 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
(snip)
答案 0 :(得分:0)
在没有真正解决方案的情况下回答自己的问题时,我感到内gui,但是我在这里...
我一直在研究如何解决此问题,但无济于事。两年不活动之后,我决定重试。
自2018年以来,我已经格式化计算机并安装了各种操作系统更新,甚至可能是一些X11更新;我将所有项目依赖项(包括bgfx)更新为最新版本;然后我从.NET Core App 2.0升级到3.0。
也许我使用的bgfx版本有问题?那个版本的.NET运行库中的动态链接中可能存在一个错误?也许我的Xlib.so版本有问题?
我想我永远不会真正知道,但是现在可以了。魔术。