Я использую distutils для сборки модуля расширения Python, написанного на C ++. У меня проблема в том, что для компиляции модуля расширения мне нужно связать с определенной общей библиотекой. Это требует установки дополнительного флага компилятора. Итак, я просмотрел документы Python и узнал о свойстве extra_compile_args
объекта Extension
. Поэтому я попробовал следующее:
from distutils.core import setup, Extension
module = Extension('test', sources = ['test.cpp'])
module.extra_compile_args = ['--std=c++0x', '-l mylib'];
setup(name = 'test', version = '1.0', ext_modules = [module])
Это похоже на компиляцию, за исключением того, что когда я импортирую свой модуль в Python, он выдает исключение ImportError
из-за неопределенного символа. Таким образом, очевидно, что библиотека неправильно связывалась. Поэтому я попытался написать одноразовую программу на C ++, которая связывалась с общей библиотекой, и она работала нормально. Затем я понял, что с distutils
происходит нечто действительно странное, потому что, если я добавлю аргумент компиляции, который ссылается на поддельное имя библиотеки, distutils просто скомпилирует все без проблем:
module.extra_compile_args = ['--std=c++0x', '-l some_fake_library'];
Когда я запускаю setup.py build
, сборка запускается без ошибок!
Итак, что здесь происходит? Как я могу скомпилировать модуль расширения, который требует связи с общей библиотекой?