Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# bgfx共享库“;未定义符号:XLockDisplay";来自Linux上的.NET内核_C#_Linux_.net Core_Pinvoke_Bgfx - Fatal编程技术网

C# bgfx共享库“;未定义符号:XLockDisplay";来自Linux上的.NET内核

C# bgfx共享库“;未定义符号:XLockDisplay";来自Linux上的.NET内核,c#,linux,.net-core,pinvoke,bgfx,C#,Linux,.net Core,Pinvoke,Bgfx,我正试图用C#编写一个简单的应用程序,它有.NET内核。它在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++(尤其是Linu

我正试图用C#编写一个简单的应用程序,它有.NET内核。它在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)非常无知,我已经尝试了所有我能想到的。我正在寻找解决此问题的提示非常感谢您的帮助

参考代码 是用于创建新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();  // <- this line causes the crash

    // (snip)
}
我注意到的事情
    <> >包含的C++实例运行良好,我只是从C++中遇到这个问题(虽然库是静态链接在C++实例中的,我是从C中动态链接PInvoke的)。
  • 我确定了要触发的碰撞。这一行之前的所有代码都确实运行过(我检查了tracelogs,它们实际上一直打印到崩溃,在函数调用之前,我确实成功地从C#以其他方式与库交互)

  • 奇怪的是,libbgfx-shared-libDebug.so(3.6MB)比libbgfx-shared-libRelease.so(5.4MB)轻。对于(bgfx.dll 728KB和bgfx_debug.dll 3.5MB),情况正好相反

  • 在初始化bgfx之前,我从C#执行
    XCreateSimpleWindow()
    ,并且窗口确实出现,因此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);
    }
    
我试过的东西
  • 从(我从C#使用的PInvoke库的作者)而不是从原始存储库编译libbgfx-shared-libDebug.so-无更改
  • 使用发布库而不是调试库-无更改
  • 使用
    readelf-d libbgfx shared libDebug.so
    检查库,查看X11是否标记为静态依赖项-它不是
  • < L>从代码> > PROC/1234/MAPs/COD>共享X11库加载-在我的C测试中包含相同的库,并在包含的C++示例中加载相同的库
  • 在没有调试器的情况下运行.NET Core-无更改
  • 使用
    LD\u预加载
    LD\u库路径
    强制预加载libbgfx-shared-libDebug.so库-无更改
  • 在glcontext_glx.cpp:66处注释有问题的行并重新生成-错误从
    未定义的符号:XLockDisplay
    更改为
    未定义的符号:glXQueryVersion
    ,在下一行中调用
  • -lm-lpthread-lX11
    标志添加到编译器(如by)-不再打印错误行,但调用
    XLockDisplay
    时程序仍会崩溃
有趣的事 libbgfx-shared-libDebug.so的静态依赖项:

运行“我的代码”时的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共享LIbDebug .so):


我感到内疚回答我自己的问题没有一个真正的解决办法,但我走了

我一直在研究如何解决这个问题,但毫无结果。两年不活动之后,我决定再试一次

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

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


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

您需要链接到X11 libs。g++-o testImage-O2-L/usr/X11R6/lib-lm-lpthread-lX11./test.o请看:我怀疑(因为
readelf
没有在依赖项中列出libX11),但我不知道在构建脚本中向何处添加开关。我也不明白为什么bgfx库的作者还没有这么做。不管怎样,我会尽力照你说的做,谢谢!感谢您的提示,我找到了在哪里添加
-lm-lpthread-lX11
开关并重新构建。现在该错误不再打印,但程序仍在同一行崩溃。我将通过删除c#项目中的bin文件夹来重新编译整个项目。有时更新库时,编译器依赖项无法识别库更新,因此无法正确编译文件。请参阅以下网页:
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)
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)