【问题标题】:bgfx shared library "undefined symbol: XLockDisplay" from .NET Core on LinuxLinux 上 .NET Core 的 bgfx 共享库“未定义符号:XLockDisplay”
【发布时间】:2018-05-13 07:45:57
【问题描述】:

我正在尝试使用 .NET Core 在 C# 中编写一个简单的 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)
}

ThisBgfx.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 动态链接)。

  • 我确定崩溃是从glcontext_glx.cpp:66 触发的。此行之前的所有代码确实运行(我检查了跟踪日志,它们实际上是在崩溃之前打印出来的,并且在进行该函数调用之前,我确实以其他方式成功地从 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 库实际上已正确链接。

我尝试过的事情

  • Michael Popoloski's bgfx fork(我在 C# 中使用的 PInvoke 库的作者)而不是从原始存储库编译 libbgfx-shared-libDebug.so - 没有变化
  • 使用发布库而不是调试库 - 没有变化
  • 使用 readelf -d libbgfx-shared-libDebug.so 检查库以查看 X11 是否标记为静态依赖项 - 不是
  • /proc/1234/maps 检查是否加载了共享 X11 库 - 在我的 C# 测试和包含的 C++ 示例中加载了相同的库
  • 在没有调试器的情况下运行 .NET Core - 没有变化
  • 使用 LD_PRELOADLD_LIBRARY_PATH 强制预加载 libbgfx-shared-libDebug.so 库 - 没有变化
  • glcontext_glx.cpp:66 处注释违规行并重建 - 错误从 undefined symbol: XLockDisplay 更改为 undefined symbol: glXQueryVersion,在下一行调用
  • -lm -lpthread -lX11 标志添加到编译器(如suggested by jdweng)- 不再打印该错误行,但在调用XLockDisplay 时程序仍然崩溃

有趣的事情

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)

【问题讨论】:

  • 您需要链接 X11 库。 g++ -o testImage -O2 -L/usr/X11R6/lib -lm -lpthread -lX11 ./test.o 见:ubuntuforums.org/showthread.php?t=2256551
  • 我怀疑(因为readelf 没有在依赖项中列出 libX11),但我不明白在 buildscript 中的何处添加开关。我也不明白为什么 bgfx 库的作者还没有这样做。不管怎样,我会尽量按你说的做,谢谢!
  • 感谢提示,我找到了在哪里添加-lm -lpthread -lX11 开关并重建。现在不再打印该错误,但程序仍然在同一行崩溃。
  • 我会通过删除 c# 项目中的 bin 文件夹来重新编译整个项目。有时,当更新库时,编译器依赖项无法识别库更新,因此无法正确编译文件。
  • 查看以下网页:geekshells.org/cgi-bin/…

标签: c# linux .net-core pinvoke bgfx


【解决方案1】:

在没有真正解决方案的情况下回答我自己的问题,我感到内疚,但我走了……

我一直在研究如何解决这个问题,但无济于事。两年无所事事,我决定再试一次。

自 2018 年以来,我已经格式化了我的计算机并安装了各种操作系统更新,甚至可能是一些 X11 更新;我将所有项目依赖项(包括 bgfx)更新到最新版本;我从 .NET Core App 2.0 升级到 3.0。

也许我使用的 bgfx 版本有问题?也许该版本的 .NET 运行时中的动态链接存在错误?也许我的 Xlib.so 版本有问题?

我想我永远不会真正知道,但现在它起作用了。魔法。

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 2015-03-08
    • 2016-10-16
    • 1970-01-01
    • 2018-04-14
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多