3

Мне нужно сделать расширение C с distutils (и/или setuptools), которое может быть использовано BOTH динамически во время выполнения и во время компиляции (для разных целей). Это не проблема для Linux, но это проблема в OS X. По умолчанию distutils создает «пакет» в OS X (и называет его .so), который можно использовать во время выполнения, но НЕ во время компиляции. Мне нужно сделать .dylib, с которым можно связать во время компиляции, и мне нужно сделать это в файле setup.py, который я могу упаковать для PyPI.Как создать расширение .dylib C на mac os x с distutils и/или setuptools?

Независимо от того, что я пытаюсь, distutils продолжает создавать пучок, и когда я пытаюсь связать эту библиотеку, я получаю сообщение об ошибке. Вы можете проверить явно создан ли Distutils сверток или динамически подключаемая библиотека, с помощью файла в командной строке:

file libA.so 
libA.so: Mach-O 64-bit bundle x86_64 

Следующая команда куб.см дает мне то, что я хочу:

cc -fPIC -shared source1.o source2.o -o libA.so 
file libA.so 
libA.so: Mach-O 64-bit dynamically linked shared library x86_64 

ответ

2

Вот что работал для меня (добавленные строки в моем setup.py):

if sys.platform == 'darwin': 
    from distutils import sysconfig 
    vars = sysconfig.get_config_vars() 
    vars['LDSHARED'] = vars['LDSHARED'].replace('-bundle', '-dynamiclib') 

Эта конфигурация кажется быть зашитым в модуле _sysconfigdata. Это также переопределение с помощью переменных окружения, так что это работает, а также:

LDSHARED="cc -dynamiclib -undefined dynamic_lookup -arch x86_64 -arch i386 -Wl,-F." python setup.py install 
+0

К сожалению конце ответа, но я просто попытался это, и оба метода оставить меня с «пачкой» после того, как я проверяю с 'файлом libA.so' (или если я пытаюсь скомпилировать ссылку libA.so, я получаю то же самое «не могу связываться с ошибкой bundle, only dylibs»). Какие-либо предложения? – Dan

+1

В выводе 'setup.py build' в разделе' 'running build_ext' 'отображаются фактические командные строки, используемые для компиляции и ссылки. Посмотрите на команду связи (последняя, ​​которая создает файл .so), на нее влияет LDSHARED def? Или другими окружениями vars в 'sysconfig.get_config_vars()'? Если это так, возможно, вы можете попытаться настроить эти вары. Если все остальное не удается, вы можете отлаживать 'distutils/command/build_ext.py', чтобы увидеть, как он генерирует аргументы в' self.compiler.link_shared_object() '. Надеюсь это поможет. –

+0

Мне явно не хватает чего-то важного, потому что я попробовал еще раз, и теперь я не только получаю динамически связанную библиотеку, я не могу получить пакет сейчас (мне нужны оба для разных целей). Я попробовал один и тот же код, но заменил replace ('- dynamiclib', '-bundle') и по-прежнему получаю динамически связанную библиотеку. Когда я печатаю sysconfig.get_config_vars(), я получаю все -bundle и no -dynamiclib. Ваши предложения по отладке очень полезны, но когда я попытался создать python setup.py, я получаю «running build_ext», но без вывода ниже. Есть идеи? Большое спасибо за Вашу помощь. – Dan