GOOGLE ADS

среда, 4 мая 2022 г.

Как возможна ошибка «неопределенный символ», если общие зависимости предоставляют этот символ?

Я пытаюсь скомпилировать GTK 3.24.33 из исходников. В какой-то момент в процессе сборки я получил следующую ошибку

Cannot load module /home/felix/apps/src/libraries/gtk-3.24.33/modules/input/im-wayland.la: /home/felix/apps/src/libraries/gtk-3.24.33/modules/input/.libs/im-wayland.so: undefined symbol: wl_proxy_marshal_flags

Конечно

nm /home/felix/apps/src/libraries/gtk-3.24.33/modules/input/.libs/im-wayland.so | grep wl_proxy_marshal_flags

возвращается

U wl_proxy_marshal_flags

Если я сделаю

ldd /home/felix/apps/src/libraries/gtk-3.24.33/modules/input/.libs/im-wayland.so

Я получаю среди других зависимостей

libwayland-client.so.0 => /home/felix/apps/install/lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f417c745000)

и

nm /home/felix/apps/install/lib/x86_64-linux-gnu/libwayland-client.so.0 | grep wl_proxy_marshal_flags

возвращается

0000000000006740 T wl_proxy_marshal_flags

Как возможно, что возникает undefined symbolошибка? Мне кажется, что есть вся необходимая информация, чтобы найти символ wl_proxy_marshal_flags.


Решение проблемы


Как может произойти ошибка неопределенного символа? Мне кажется, что есть вся необходимая информация, чтобы найти символ wl_proxy_marshal_flags.


Есть как минимум два возможных ответа:


  1. Определение символа присутствует в libwayland-client.so.0, но не экспортируется из него.

  2. Какая-то другая версия libwayland-client.so.0загружается в любой двоичный файл, вызываемый на неудачном этапе сборки.


Чтобы доказать или опровергнуть (1), используйте nm -D /home/felix/apps/install/lib/x86_64-linux-gnu/libwayland-client.so.0 | grep wl_proxy_marshal_flags. Если символ появляется в nm -D...выводе, значит он экспортирован (и доступен для компоновки по im-wayland.so). Если это не так, то (1) является основной причиной.

Чтобы выяснить, что libwayland-client.so.0загружается во время сборки, вам нужно выяснить, какая Makefileкоманда выполняется, и добавить к ней префикс env LD_DEBUG=files,libs.... Использование этой переменной среды дает динамическому загрузчику указание печатать, какие двоичные файлы и библиотеки он загружает. Найдите этот вывод для libwayland-client.so.0. Если загружается системная версия (вместо созданной вами), возможно, эта версия не wl_proxy_marshal_flagsэкспортировала из нее.

Если (2) является причиной, вам, возможно, придется установить LD_LIBRARY_PATHперед выполнением сборки. (Это также означает, что Makefiles для GTK не работает.)

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...