如何使用distutils和/或setuptools在mac os x上创建.dylib C扩展?

时间:2015-09-06 02:59:06

标签: macos shared-libraries setuptools distutils python-c-extension

我需要使用distutils(和/或setuptools)进行C扩展,这些扩展可以在运行时和编译时(出于不同目的)动态使用。这在Linux上不是问题,但它在OS X上是一个问题。默认情况下,distutils会创建一个" bundle"在OS X上(并命名为.so),可以在运行时使用,但不能在编译时使用。我需要创建一个.dylib,它可以在编译时链接到,我需要在一个可以打包为PyPI的setup.py中进行。

无论我尝试什么,distutils都会不断创建一个包,当我尝试链接这个库时,我收到一个错误。您可以使用命令行上的文件显式检查distutils是创建了包还是动态链接库:

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

以下cc命令为我提供了我想要的内容:

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

1 个答案:

答案 0 :(得分: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