gpt4 book ai didi

c++ - 构建 python 模块并将其与 MacOSX 框架链接

转载 作者:IT老高 更新时间:2023-10-28 22:38:20 24 4
gpt4 key购买 nike

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

我要链接到我的框架,我的 LDFLAGS 环境变量应该如下所示:

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

由于我在扩展模块文档中没有找到任何“框架”关键字,因此我使用了 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 的输出,由 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)

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

干杯,

最佳答案

这与未定义的 dynamic_lookup 无关,而与 distutils 无关。它将 extra_link_flags 附加到它为 python 构建选择的链接标志上。相反,它应该预先添加它,因为 -framework 列表必须位于在 cmdline 上使用它们的对象之前(AFAIK,这是由于 gcc 如何收集符号以进行链接)。我个人使用的快速修复方法是使用

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

或您需要的任何框架。 LDFLAGS 被添加到 distutils 自己的标志之前。请注意,您的软件包将无法 pip install。正确的修复只能来自 distutils - 恕我直言,他们应该支持 frameworks 就像他们支持 libraries 一样。

或者,您也可以添加

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

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

关于c++ - 构建 python 模块并将其与 MacOSX 框架链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com