Встроенный в приложение интерпретатор Python не может загрузить собственные модули - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть приложение, которое статически ссылается на libpython.a (2.7). Из интерпретатора приложения я пытаюсь импортировать модуль time (time.so), который завершается неудачно с:

ImportError: ./time.so: undefined symbol: PyExc_IOError

Итак, этот модуль имеет неразрешенные символы:

nm -D time.so | grep PyExc_IOError
         U PyExc_IOError

Я понял, что этот символ отбрасывается компоновщиком при связывании приложения. Хорошо, теперь я связываю libpython со всеми символами:

... -Wl,-whole-archive -lpython -Wl,-no-whole-archive ...

Символ теперь там:

$ nm app | grep PyExc_IOError
8638348 D PyExc_IOError
08638ca0 d _PyExc_IOError

Но я все еще получаю ту же ошибку импорта. Где проблема?

1 Ответ

2 голосов
/ 19 ноября 2010

Кроме того, чтобы убедиться, что весь libpython включен в ваш бинарный файл, вам также необходимо убедиться, что символы в библиотеке доступны для загружаемых общих объектов.Когда вы связываете libpython (статически) с основным двоичным файлом, это означает, что вам нужен аргумент компоновщика --export-dynamic (поэтому -Wl,--export-dynamic или -Xlinker --export-dynamic в качестве аргумента gcc.) При загрузке общего объекта с помощью libpython (например,вставьте libpython в плагин для вашего приложения) это означает, что вы должны убедиться, что общий объект загружен с флагом RTLD_GLOBAL в dlopen().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...