开发者社区> 问答> 正文

构建一个python模块并将其链接到MacOSX框架

我正在尝试在MacOSX 10.6上构建Python扩展并将其链接到多个框架(仅适用于i386)。我使用distutils和Extension对象制作了setup.py文件。

我要链接到我的框架,我的LDFLAGS env var应该看起来像:

LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2

由于在扩展模块文档中没有找到任何“ framework”关键字,因此我改用了extra_link_args关键字。

Extension('test',
define_macros = [('MAJOR_VERSION', '1'), ,('MINOR_VERSION', '0')],
include_dirs = ['/usr/local/include', 'include/', 'include/vitale'],
extra_link_args = ['-arch i386',
                   '-framework fwk1',
                   '-framework fwk2'],
sources = "testmodule.cpp",
language = 'c++' )

一切都在编译和链接中。如果我从extra_link_args中删除-framework行,则链接器将按预期失败。这是python setup.py build产生的最后两行:

/usr/bin/g++-4.2 -arch x86_64 -arch i386 -isysroot /
-L/opt/local/lib -arch x86_64 -arch i386 -bundle
-undefined dynamic_lookup build/temp.macosx-10.6-intel-2.6/testmodule.o
-o build/lib.macosx-10.6-intel-2.6/test.so
-arch i386 -framework fwk1 -framework fwk2

不幸的是,我刚刚生成的.so无法找到此框架提供的几个符号。我试图用otool检查链接的框架。他们都没有出现。

$ otool -L test.so
test.so:
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)

otool的输出是在测试二进制文件上运行的,它使用我的文章顶部描述的LDFLAGS由g ++和ldd制成。在此示例中,-framework确实起作用。

$ otool -L vitaosx vitaosx: ```js /Library/Frameworks/fwk1.framework/Versions/A/fwk1 (compatibility version 1.0.0, current version 1.0.0) /Library/Frameworks/fwk2.framework/Versions/A/fwk2 (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)

可以将此问题链接到链接步骤上的“ -undefined dynamic_lookup”标志吗?我对在Google上找到的几行文档感到有些困惑。

展开
收起
祖安文状元 2020-02-23 16:43:22 6912 0
1 条回答
写回答
取消 提交回答
  • 这与未定义的dynamic_lookup无关,而与distutils有关。它将extra_link_flags附加到为python构建选择的链接标志。相反,它应该放在前面,因为-framework列表必须位于在cmdline上使用它们的对象之前(这是gcc如何收集链接符号的原因)。我个人使用的快速修复程序

    LDFLAGS="-framework Carbon" python setup.py build_ext --inplace
    
    

    或您需要的任何框架。LDFLAGS是distutils自己的标志的前缀。请注意,您的包裹将无法使用pip install。正确的修复只能来自distutils-他们应该frameworks像支持的那样支持imho libraries。

    另外,您也可以添加

    import os
    os.environ['LDFLAGS'] = '-framework Carbon'
    
    

    在您的setup.py中。这样您的包裹就应该pip install可以了。

    2020-02-23 16:43:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载