Я пишу расширение Python 2.7 C ++. Расширение Python оборачивает часть библиотеки C ++ (Kaldi).
Ранее я создал разделяемую библиотеку и распространил ее с расширением Python. (Мне нужно было настроить LD_LIBRARY_PATH).
Я хочу скомпилировать расширение статически. Библиотека Kaldi может быть скомпилирована статически (с -fPIC
флаг). Проблема в том, что компиляция зависит от других библиотек, а флаги генерируются configure
скрипт.
Я хочу скомпилировать расширение, используя setup.py
и «украсть» настройку компиляции из Makefile
,
Как бы вы это сделали?
Команда для связи общей библиотеки была:
$(CXX) -shared -DPIC -o $@ -Wl,-soname=$@,--whole-archive $^ -Wl,--no-whole-archive $(EXTRA_LDLIBS) $(LDFLAGS) $(LDLIBS)
в setup.py
Я имел:
ext_modules.append(Extension('pykaldi.decoders',
language='c++',
include_dirs=['..', 'fst'],
library_dirs=['.'],
libraries=['pykaldi'],
sources=['pykaldi/decoders.pyx'],
))
$(EXTRA_LDLIBS)
,$(LDFLAGS)
а также $(LDLIBS)
генерируются configure
скрипт.
$(LDLIBS)
содержит несколько статических библиотек, некоторые совместно используются.
Теперь у меня есть
if STATIC:
# STATIC
# TODO extract linking parameters from Makefile
library_dirs, libraries = [], []
extra_objects = ['pykaldi.a', ]
else:
# DYNAMIC
library_dirs = ['.'],
libraries = ['pykaldi']
extra_objects = []
ext_modules.append(Extension('pykaldi.decoders',
language='c++',
include_dirs=['..', 'fst'],
library_dirs=library_dirs,
libraries=libraries,
extra_objects=extra_objects,
sources=['pykaldi/decoders.pyx'],
))
Примечание 1: я использую Cython, но это не должно иметь значения.
Примечание 2: я знаю, что могу скомпилировать расширение, используя make
, Я бы предпочел setup.py
для лучшего развертывания.
Вам нужно будет связать статическое расширение с Python при сборке питон исполняемый файл.
Это связано с тем, что расширения загружаются в интерпретатор с использованием dlopen (или LoadLibrary в Windows), и эта функциональность не может поддерживать статические «библиотеки», которые являются не более чем архивом объектных файлов. Объектные файлы являются необработанной формой, которая все еще не может использоваться системой во время выполнения, пока они не пройдут этап связывания.
Других решений пока нет …