如何使用distutils和/或setuptools在Mac OS X上创建.dylib C扩展? [英] How to create a .dylib C extension on mac os x with distutils and/or setuptools?

查看:125
本文介绍了如何使用distutils和/或setuptools在Mac OS X上创建.dylib C扩展?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to make a C extension with distutils (and/or setuptools) that can be used BOTH dynamically at runtime, and at compile time (for different purposes). This isn't a problem on Linux, but it's an issue on OS X. By default, distutils creates a "bundle" on OS X (and names it .so), which can be used at runtime, but NOT at compile time. I need to make a .dylib, which can be linked to at compile time, and I need to do it within a setup.py that I can package for PyPI.

无论我尝试什么,distutils都会继续创建一个包,并且当我尝试链接到该库时,会出现错误.您可以通过在命令行上使用文件来明确检查distutils是否创建了捆绑软件或动态链接的库:

No matter what I try, distutils keeps creating a bundle, and when I try to link against this library, I get an error. You can check explicitly whether distutils created a bundle or dynamically linked library by using file on the command line:

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

下面的cc命令给了我我想要的东西:

The following cc command gives me what I want:

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中添加了几行):

Here's what worked for me (added lines in my setup.py):

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

此配置似乎已硬连接到模块_sysconfigdata中.使用环境变量也可以覆盖它,因此它也可以正常工作:

This configuration seems to be hard-wired in the module _sysconfigdata. It's also overridable using environment variables, so this works as well:

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

这篇关于如何使用distutils和/或setuptools在Mac OS X上创建.dylib C扩展?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆