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

2024-03-14

我正在尝试在 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,


这与未定义的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就像他们支持一样libraries.

或者,您也可以添加

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

在你的 setup.py 中。那么你的包裹应该是pip installable.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建 python 模块并将其链接到 MacOSX 框架 的相关文章

随机推荐

  • 在 ASP.NET Web 表单中创建动态 UI

    我需要创建一个调查页面 其中包含从数据库读取的以下结构 Survey QuestionA a Answer1 Radio button b Answer2 Radio button c Answer3 Radio button d Answ
  • 包标识符应该是小写还是驼峰?

    假设我有一个名为 Foo Bar 的应用程序 包标识符应该是com tyilo foobar or com tyilo FooBar 什么是最正常的 苹果是怎么做的 您可以做任何事情 但为了让生活更简单并防止常见错误 将其全部小写更容易 但
  • 在本地计算机上使用 Github 操作秘密 - 可能吗?

    我知道我可以使用curl 来通过curl 列出存储库的秘密 如下所示 curl H Accept application vnd github v3 json H Authorization token personal access to
  • Python 寻找素因数

    两部分问题 试图确定 600851475143 的最大质因数 我在网上发现了这个程序似乎有效 问题是 尽管我了解该程序正在做什么的基础知识 但我很难弄清楚它到底是如何工作的 另外 我希望您能阐明您可能知道的寻找素因数的任何方法 也许无需测试
  • Visual Studio 2010 的 HWnd

    有没有办法从 VSIX 扩展获取指向 Visual Studio 2010 顶部窗口的 HWnd 指针 我想更改窗口的标题 由于您的 VSIX 扩展很可能会与 Visual Studio 一起在进程内运行 因此您应该尝试以下操作 Syste
  • fork:关闭所有打开的套接字

    我在用multiprocessing Pool map 它分叉当前进程 我的理解是 默认情况下 所有文件描述符包括插座分叉时从主进程复制 主进程本身是一个Web服务器 使用cherrypy http cherrypy org 所以这会对开放
  • 需要在 bootstrap css 中单击时将图像加载为模态

    我尝试通过淡入淡出背景来加载模态图像 这个对我有用 但是对于多个图像 如何在不编写多个模态 div 的情况下根据图像 id 加载我单击的图像
  • VB 2010 中的对象是否获得了与 C# 4.0 中的动态相同的优化?

    有些人认为 C 4 0 引入的功能dynamic关键字与VB的 一切都是对象 特性相同 但是 对动态变量的任何调用都将被转换为委托一次 从那时起 将调用该委托 在VB中 当使用Object 不应用缓存 并且对非类型化方法的每次调用都涉及大量
  • 使用 helm 在 kubernetes 集群中运行 Nexus

    有一个 Nexus 的舵图 https github com helm charts tree master stable sonatype nexus https github com helm charts tree master st
  • 关于Future.firstCompletedOf和Garbage Collect机制

    I ve encountered this problem in my real life project and proved by my testing code and profiler Instead of pasting tl d
  • 如何创建一个流,其中的项目基于该流之前返回的项目?

    我有一个函数可以生成futures Stream基于一个论点 我想多次调用这个函数并将流压平在一起 使问题变得复杂的是 我想将流返回的值作为参数提供给原始函数 具体来说 我有一个函数可以将数字流返回到零 fn numbers down to
  • 具有精确 OR 值的嵌套 IF 语句

    我是 Excel IF 语句的新手 并且在我认为所谓的 IF 语句方面遇到了麻烦嵌套 IF 函数 我在这里查看了其他 IF 问题 它们对于我的新手大脑来说太复杂了 无法理解 我有一列 里面有数字 大约有十几个不同的数字 这些数字代表一个特定
  • 对重复内容不显示是否会影响 SEO/语义?

    重复内容上的 Display none 是否会影响 SEO 语义 假设您正在构建一个移动优先的响应式网站 在较小的断点处 您选择显示页面的标题标语 h1 在主要英雄横幅中 但是 稍后您希望在同一位置显示公司徽标 并在子横幅中显示您的口号 例
  • 如何获取使用 Angular $http 下载的文件的名称?

    我编写了使用 Angular http 下载文件的代码 文件的名称是notURL 中指定 URL 包含文件的唯一标识符 该标识符是从应用程序外部获取的 When http get myUrl 被调用 一切正常 文件已被检索 我可以在回调处理
  • Java 中动态转换为泛型类型

    这是我整理的一个简单的例子 private static
  • 使用 WPF 视觉层的高性能图形

    我正在创建一个 WPF 映射程序 该程序可能会同时加载数百个文件并将其绘制到屏幕上 并且用户可能想要缩放和平移此显示 其中一些文件类型可能包含数千个点 这些点很可能作为某种路径连接 其他支持的格式包括 TIFF 文件 使用一个绘制所有数据的
  • Stripe API - 收据列表

    我正在使用 Stripe API 我想向客户展示他们的发票历史记录列表以及相关收据 我在 Stripe API 中找不到任何地方 https stripe com docs api lang php https stripe com doc
  • PHP 会话很难跨分布式系统扩展吗?

    在工作中 我们几乎用 Java 和 Perl 完成所有工作 但我想使用 PHP 和会话构建一个功能 有些人认为尝试在我们的系统上进行 PHP 会话是一个坏主意 因为它分布到许多服务器 具体问题会是什么 您还可以使用自定义会话保存处理程序 h
  • 如何在条件查询中使用MAP的键?

    我有一个这样的豆子 Class TestA Map
  • 构建 python 模块并将其链接到 MacOSX 框架

    我正在尝试在 MacOSX 10 6 上构建 Python 扩展并将其链接到多个框架 仅限 i386 我使用 distutils 和 Extension 对象创建了一个 setup py 文件 我为了链接我的框架 我的LDFLAGS环境变量