#c #python #gcc #distutils
#c #python #gcc #distutils
Вопрос:
Я использую 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
происходит что-то действительно странное, потому что, если я добавлю аргумент compile, который ссылается на фиктивное имя библиотеки, distutils просто скомпилирует все без проблем:
module.extra_compile_args = ['--std=c 0x', '-l some_fake_library'];
Когда я запускаю setup.py build
, сборка выполняется без ошибок!
Итак, что здесь происходит? Как я могу скомпилировать модуль расширения, который требует привязки к общей библиотеке?
Ответ №1:
На самом деле для этого есть специальная опция.
Например:
libraries=["rt"]
Вы оставляете части option и lib.
Ответ №2:
Одна из целей distutils — сделать ваш код не зависящим от одного компилятора. Ваш «-l somelib» выглядит так, как будто он предназначен для работы с GCC (хотя это должно быть «-lsomelib», без пробелов). Вот почему вы используете libraries
опцию для Extension
класса. Затем Distutils передаст соответствующую команду link любому компилятору, который он использует.
Вы также можете посмотреть на фактические команды сборки, которые использует distutils, и выполнить их самостоятельно, чтобы увидеть, что происходит не так.