Сборка модуля расширения Python с distutils - PullRequest
4 голосов
/ 23 апреля 2011

Я использую 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, сборка запускается без ошибок!

Итак, что здесь происходит? Как я могу скомпилировать модуль расширения, который требует связи с общей библиотекой?

Ответы [ 2 ]

5 голосов
/ 23 апреля 2011

Для этого есть специальная опция.

Например:

libraries=["rt"]

Вы опускаете опцию и части lib.

3 голосов
/ 23 апреля 2011

Одна из целей distutils - сделать ваш код не зависимым от одного компилятора.Ваш "-l somelib" выглядит так, как будто он предназначен для работы с GCC (даже если это должен быть "-lsomelib", без пробела).Вот почему вы используете опцию libraries для класса Extension.Затем Distutils передаст соответствующую команду ссылки любому используемому компилятору.

Вы также можете посмотреть фактические команды сборки, которые использует distutils, и выполнить их самостоятельно, чтобы увидеть, что идет не так.

...