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

mad*_*flo 14 c++ python macos dynamic-linking

我正在尝试在MacOSX 10.6上构建一个Python扩展,并将其链接到几个框架(仅限i386).我使用distutils和Extension对象创建了一个setup.py文件.

我命令链接我的框架,我的LDFLAGS env var应该如下:

LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
Run Code Online (Sandbox Code Playgroud)

由于我在Extension模块文档中没有找到任何'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++' )
Run Code Online (Sandbox Code Playgroud)

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

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

不幸的是,我刚刚制作的.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)
Run Code Online (Sandbox Code Playgroud)

在测试二进制文件上运行otool的输出,使用g ++和ldd使用我帖子顶部描述的LDFLAGS制作.在这个例子中,-framework确实有效.

$ otool -L vitaosx 
vitaosx:
    /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)
Run Code Online (Sandbox Code Playgroud)

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

干杯,

Sir*_*Ver 8

这与未定义的dynamic_lookup无关,但与distutils无关.它将extra_link_flags附加到它为python构建选择的链接标志.相反它应该添加它,因为-framework列表必须在cmdline上使用它们的对象之前(AFAIK这是由于gcc如何收集符号进行链接).我亲自使用的快速解决方案正在构建

    LDFLAGS="-framework Carbon" python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

或者你需要的任何框架.LDFLAGS预先设置了distutils自己的标志.请注意,您的包将无法使用pip install.一个适当的修复只能来自distutils - 他们应该支持frameworks他们支持libraries.

或者,您也可以添加

import os
os.environ['LDFLAGS'] = '-framework Carbon'
Run Code Online (Sandbox Code Playgroud)

在您的setup.py中.然后你的包应该pip install可以.