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

Dan*_*Dan 5 macos distutils shared-libraries setuptools python-c-extension

我需要使用 distutils (和/或 setuptools)创建一个 C 扩展,它可以在运行时和编译时动态使用(用于不同的目的)。这在 Linux 上不是问题,但在 OS X 上却是问题。默认情况下,distutils 在 OS X 上创建一个“捆绑包”(并将其命名为 .so),它可以在运行时使用,但不能在编译时使用。我需要制作一个 .dylib,它可以在编译时链接到,并且我需要在可以为 PyPI 打包的 setup.py 中执行此操作。

无论我尝试什么,distutils 都会不断创建捆绑包,当我尝试链接该库时,我收到错误。您可以通过在命令行上使用 file 显式检查 distutils 是否创建了捆绑包或动态链接库:

file libA.so
libA.so: Mach-O 64-bit bundle x86_64
Run Code Online (Sandbox Code Playgroud)

以下 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
Run Code Online (Sandbox Code Playgroud)

Uri*_*kai 3

这对我有用(在我的 中添加了行setup.py):

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

该配置似乎是硬连线在模块中的_sysconfigdata。它也可以使用环境变量覆盖,所以这也有效:

LDSHARED="cc -dynamiclib -undefined dynamic_lookup -arch x86_64 -arch i386 -Wl,-F." python setup.py install
Run Code Online (Sandbox Code Playgroud)

  • 在“setup.py build”的输出中,在“running build_ext”下,它显示了用于编译和链接的实际命令行。看看链接命令(最后一个,创建.so文件),它是否受到LDSHARED def的影响?或者通过`sysconfig.get_config_vars()`中的其他环境变量?如果是这样,也许您可​​以尝试调整这些变量。如果所有其他方法都失败,您可以调试 `distutils/command/build_ext.py` 以查看它如何生成 `self.compiler.link_shared_object()` 的参数。希望这可以帮助。 (2认同)