我正在尝试在 MacOSX 10.6 上构建 Python 扩展并将其链接到多个框架(仅限 i386)。我使用 distutils 和 Extension 对象创建了一个 setup.py 文件。
我为了链接我的框架,我的LDFLAGS环境变量应该如下所示:
LDFLAGS = -lc -arch i386 -framework fwk1 -framework fwk2
由于我在扩展模块文档中没有找到任何“框架”关键字,因此我使用了额外链接参数关键字代替。
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 在测试二进制文件上运行的输出是使用 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)
这个问题是否可以链接到链接步骤上的“-undefineddynamic_lookup”标志?我对在 Google 上找到的几行文档感到有点困惑。
Cheers,