【问题标题】:How to create a .dylib C extension on mac os x with distutils and/or setuptools?如何使用 distutils 和/或 setuptools 在 mac os x 上创建 .dylib C 扩展?
【发布时间】:2015-12-01 21:12:17
【问题描述】:

我需要使用 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

下面的 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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 抱歉,回复晚了,但我刚试过这个,在我检查file libA.so 后,这两种方法都给我留下了一个“捆绑”(或者如果我尝试编译链接 libA.so 我得到同样的“无法与捆绑链接,只有 dylibs”错误)。有什么建议吗?
    • setup.py build 的输出中,在“running build_ext”下,它显示了用于编译和链接的实际命令行。查看链接命令(最后一个,创建 .so 文件),它是否受 LDSHARED def 影响?或者通过sysconfig.get_config_vars() 中的其他环境变量?如果是这样,也许您可​​以尝试调整这些变量。如果一切都失败了,您可以调试distutils/command/build_ext.py 以查看它如何生成self.compiler.link_shared_object() 的参数。希望这会有所帮助。
    • 我显然遗漏了一些重要的东西,因为我再次尝试,不仅现在获得了动态链接库,而且我现在无法获得捆绑包(我需要两者用于不同的目的)。我尝试了相同的代码,但切换替换('-dynamiclib','-bundle'),仍然得到一个动态链接库。当我打印 sysconfig.get_config_vars() 时,我得到所有 -bundle 而没有 -dynamiclib。您的调试建议非常有帮助,但是当我尝试 python setup.py build 时,我得到“正在运行 build_ext”,但它下面没有输出。有任何想法吗?非常感谢您的帮助。
    • 你确定在这种情况下构建可以通过吗?也许您需要删除build 文件夹才能重新构建?
    • 非常感谢!这同时解决了这两个问题。删除构建文件夹会显示所有打印语句(因为实际上正在构建一些东西!)并根据我的需要使用您的代码为我提供一个捆绑包或动态链接库。愚蠢的错误! setup.py 在安装之前清理目录是一种好习惯吗?大多数人会使用 pip 安装我的包。
    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2019-07-01
    • 2010-11-28
    相关资源
    最近更新 更多