2010-11-19 2 views
0

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

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 

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

+0

Вы выполняете шаги в руководстве по внедрению? Компиляция с distutils? –

+0

@ Эли, да, это прямо там. Моего внимания, связанного с гнатом, было недостаточно, чтобы сделать это до последнего абзаца. –

ответ

2

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

Смежные вопросы