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

How to create a .dylib C extension on mac os x with distutils and/or setuptools?

我需要使用 distutils (and/or setuptools) 制作一个 C 扩展,它可以在运行时和编译时动态使用(用于不同目的)。这在 Linux 上不是问题,但在 OS X 上是个问题。默认情况下,distutils 在 OS X 上创建一个 "bundle"(并将其命名为 .so) ,可以在运行时使用,但不能在编译时使用。我需要制作一个 .dylib,它可以在编译时被 link 编辑,我需要在我可以为 PyPI 打包的 setup.py 中完成它。

无论我尝试什么,distutils 都会继续创建一个包,当我尝试 link 针对这个库时,我得到一个错误。您可以通过在命令行上使用文件来明确检查 distutils 是否创建了一个包或动态 linked 库:

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

这是对我有用的(在我的 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