bgfx共享库,Linux上.NET Core的“未定义符号:XLockDisplay”

问题描述 投票:1回答:1

我正在尝试使用.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 Popoloskibgfx.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标志(如suggestedjdweng)-该错误行不再打印,但是当调用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)
    

我正在尝试使用.NET Core用C#编写一个简单的bgfx应用程序。它在Windows上运行良好,但在Linux上运行时失败,出现以下错误:/ usr / bin / dotnet:符号查找错误:/ home / ...

我感到内answer地回答我自己的问题,但没有真正的解决方案,但是我去了...

我一直在研究如何解决此问题,但无济于事。经过两年的不活动之后,我决定重试。

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

也许我使用的bgfx版本有问题?那个版本的.NET运行库中的动态链接中可能存在一个错误?我的Xlib.so版本可能有问题吗?

我想我永远不会真正知道,但是现在可以了。魔术。

c# linux .net-core pinvoke bgfx
1个回答
0
投票

我感到内answer地回答我自己的问题,但没有真正的解决方案,但是我去了...

我一直在研究如何解决此问题,但无济于事。经过两年的不活动之后,我决定重试。

© www.soinside.com 2019 - 2024. All rights reserved.