Как я могу исправить «неопределенный символ» в общей библиотеке, созданной CFFI? - PullRequest
0 голосов
/ 13 апреля 2020

Я написал программу C для отображения отображаемых в памяти видеофайлов с помощью GStreamer и GTK windows. Намерение состоит в том, чтобы создать совместно используемую библиотеку с CFFI, которую я могу вызвать из Python. Когда я пытаюсь импортировать библиотеку, я получаю сообщение о неопределенном символе.

Я воссоздал проблему с библиотекой, содержащей небольшую программу, которая просто отображает окно:

#include <gtk/gtk.h>
#include "test_cdef.h"

int main (int argc, char *argv[])
{
  return test();
}

int test()
{
  GtkWidget  *main_window;
  gtk_init (NULL, NULL);
  main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(main_window), "Test");
  gtk_window_set_default_size(GTK_WINDOW(main_window), 1600, 900);
  gtk_widget_show_all(main_window);
  g_main_loop_run (g_main_loop_new (NULL, TRUE));
  return 0;
}

Когда Я пытаюсь импортировать библиотеку и получаю следующее сообщение:

ImportError: [library file name]: undefined symbol: gtk_window_get_type

После многих поисков проблемы, которые кажутся мне наиболее близкими, были исправлены путем изменения параметров компиляции / компоновки. Я использовал g cc для сборки программы. Я предполагаю, что CFFI использует то же самое для построения библиотеки.

Если эти параметры нужно изменить, у меня возникнет два вопроса: (1) какие параметры следует использовать и (2) как эти параметры передаются в CFFI ? Буду признателен за помощь в любом вопросе.

Моя ОС - Linux Mint 19.3. Другие пакеты: GTK-3.0, python 3.6.9, python3 -cffi 1.11.5-1.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 апреля 2020

Я нашел решение. Это действительно была проблема связывания на двух разных уровнях - ссылки для создания библиотеки stati c и ссылки для создания общей библиотеки, которая связана с библиотекой stati c.

Прорыв для меня произошел, когда Я наконец смог найти имя библиотеки GTK, определяющей первую сообщенную проблему символов. Я добавил это имя библиотеки в часть команды g cc в моем make-файле. С этим одним добавлением компоновщик был достаточно хорош, чтобы сообщить о другой отсутствующей библиотеке по имени - хотя сообщение об ошибке немного крипти c - называя его отсутствующим DSO (Dynami c Shared Object). Почему дизайнеры не написали компоновщик, чтобы сообщить об упущении и автоматически добавили отсутствующую библиотеку - топи c для другого дня. Добавляя отсутствующие библиотеки один за другим, я в конечном итоге смог создать библиотеку stati c без ошибок.

С CFFI отсутствующие библиотеки указаны в списке [библиотеки] и их общем каталоге (/ usr / lib / x86_64-linix-gnu в моей системе) указан в списке [library-dirs]. При сборке общей библиотеки обнаружилось еще несколько недостающих библиотек, которые я в конечном итоге обнаружил при поиске файлов библиотеки, содержащих текстовые строки с отсутствующими символами.

...