Общая библиотека bgfx «неопределенный символ: XLockDisplay» из .NET Core в Linux - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь написать простое bgfx приложение на C # с .NET Core. Он отлично работает в 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)
}

Эта является функцией 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 ++; я динамически связываюсь с PInvoke из C #).

  • Я определил сбой, который должен быть вызван из glcontext_glx.cpp: 66 . Весь код перед этой строкой действительно запускается (я проверил трассировочные журналы, и они на самом деле печатаются до сбоя, и я успешно взаимодействую с C # с библиотекой другими способами до того, как будет выполнен этот вызов функции).

  • Как ни странно, libbgfx-shared-libDebug.so (3,6 МБ) весит меньше, чем libbgfx-shared-libRelease.so (5,4 МБ). Обратное верно для сборки Windows Майкла Пополоски ( bgfx.dll 728KB и bgfx_debug.dll 3,5 МБ).

  • Я делаю XCreateSimpleWindow() из C # перед инициализацией bgfx, и окно действительно появляется, поэтому библиотека X11 действительно связана правильно.

То, что я пытался

  • Компиляция libbgfx-shared-libDebug.so из Вилка bgfx Майкла Пополоски (автор библиотеки PInvoke, которую я использую из C #) вместо исходного репозитория - нет изменить
  • Использование библиотеки релизов вместо библиотеки отладки - без изменений
  • Проверка библиотеки с помощью readelf -d libbgfx-shared-libDebug.so, чтобы увидеть, помечен ли X11 как статическая зависимость - это не
  • Проверка с /proc/1234/maps загрузки общей библиотеки X11 - эта же библиотека загружена в моем тесте C # и во включенном примере C ++
  • Запуск .NET Core без отладчика - без изменений
  • Принудительная предварительная загрузка библиотеки libbgfx-shared-libDebug.so с LD_PRELOAD и LD_LIBRARY_PATH - без изменений
  • Комментирование ошибочной строки на glcontext_glx.cpp: 66 и перестроение - ошибка изменилась с undefined symbol: XLockDisplay на undefined symbol: glXQueryVersion, которая вызывается в следующей строке
  • Добавление -lm -lpthread -lX11 флагов к компилятору (как предложил от 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)
...