在 Mac OS X 上静态嵌入 Python 时动态符号查找失败

2024-04-17

我正在构建一个嵌入 Python 的 Mac OS X 应用程序。从技术上讲,我的应用程序是一个捆绑包(即它的主要可执行文件是 MH_BUNDLE);它是另一个应用程序的插件。我希望它静态嵌入 Python,但希望能够动态加载扩展。

我做了以下操作:我包含了整个库(-force_load path/to/libpython2.7.a),还重新导出了所有Python符号(-exported_symbol_list path/to/list),并添加了-u _PyMac_Error,我用过这个链接建议 http://docs.python.org/extending/embedding.html#linking-requirements。包本身加载良好,所有内部 Python 代码似乎都可以工作,但当它尝试导入动态库时会失败(time.so)并显示以下消息:

Traceback (most recent call last):
  ...
ImportError: dlopen(/<stripped>/time.so, 2): Symbol not found: _PyExc_OverflowError
  Referenced from: /<stripped>/time.so
  Expected in: dynamic lookup

这个符号是 Python API 的一部分,它必须已经在我的包中了。我可以检查一下:

nm -g Build/Debug/pyfm | grep _PyExc_OverflowError
00172884 D _PyExc_OverflowError
0019cde0 D _PyExc_OverflowError

(它列出了两次,因为我有两种架构,i386 和 ppc)。

The time.so没有引用任何内容,据我了解,这是设计使然:

otool -L "/<stripped>/time.so"
/<stripped>/time.so (architecture ppc):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
/<stripped>/time.so (architecture i386):
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)

我的问题似乎类似于this http://bugs.python.org/issue4434,但情况恰恰相反:我静态链接 Python,而另一张海报动态链接它(我们的平台也不同)。对他来说静态链接解决了这个问题。

为什么找不到这个符号?

Update.我怀疑发生这种情况是因为主应用程序加载了它的插件(以及我的包)RTLD_LOCAL.


我所做的“更新”表明它是正确的:主插件包在本地加载(RTLD_LOCAL),所以没有人能看到那里的任何符号,除非使用显式的dlopen其次是dlsym.

如果是 Linux,我可以通过以下方式将捆绑包提升到全局名称空间:dlopen再次使用RTLD_GLOBAL标志,但在 Mac OS X 下这不起作用。但 Mac OS X 很好地将东西打包成捆绑包,所以我只是制作了一个动态库并将其放入插件捆绑包目录中。该库自动加载为RTLD_GLOBAL并且所有Python符号都可用。

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

在 Mac OS X 上静态嵌入 Python 时动态符号查找失败 的相关文章

随机推荐

  • 是否可以将 CSS Scroll Snap 应用于 HTML 标签而不是 Body 标签

    CSS Scroll Snap 允许浏览器捕捉滚动到容器中的元素 要将相同的逻辑应用于垂直页面滚动 我发现它必须应用于而不是 见下文 这不是一个主要问题 但它确实有效地创建了一个滚动区域而不是使用窗口滚动 虽然这看起来不错 但它有一些副作用
  • 在 Xcode Interface Builder 中对场景进行排序

    所以我不知道该怎么称呼它 但它是 Xcode 中 Storyboard Editor 左侧的那个栏 显示所有不同的场景 我喜欢使用故事板 但我对它们最大的不满是场景以完全随机的方式组织在该列表中 每次我向故事板添加新的视图控制器时 它都会被
  • 阻止 Chrome 扩展程序在我的网站上运行

    作为一名网络开发人员 有什么方法可以阻止用户的 Chrome 扩展应用到我的网站吗 即标题 元标记等等 此外 如果有的话 是否还有一种方法可以将特定扩展列入白名单 这是不可能的 在网络服务器端 您只能控制浏览器允许您控制的内容 简单来说 这
  • Derby 还是 MySQL 或者...?

    对于什么类型的需求 您会选择 Apache Derby 或 Java DB 而不是 MySQL 反之亦然 我环顾四周 人们只是比较两者 但没有人谈论何时考虑每一个 我正在使用 Glassfish Java Restlet MySQL 开发一
  • sql从多个记录中仅选择最新的

    我有一个名为 客户年龄 的表 如下所示 ID 1 2 3 4 5 6 7 8 9 NAME JIM JIM JIM NICK NICK NICK Paul Paul Paul VALUE 20 13 12 10 20 8 4 24 14 我
  • 我们可以让 selenium webdriver 在运行时等待用户点击网页链接而不使用隐式等待吗?

    我正在使用 Firefox 驱动程序和 java 并尝试从网站上抓取一些数据 其中涉及人工交互 我必须要求用户输入搜索字符串 然后相应地用户必须通过人眼分析来选择打开哪个搜索结果 我们的努力只是为了通过脚本让一些零碎的东西更快地工作 我的问
  • 检查记录是否存在数据库 - 错误显示

    如何检查用户名或电子邮件是否存在 然后将错误消息放入错误数组中 现在我有 sql SELECT username email FROM users WHERE username username OR email email query m
  • 如何在 ios、swift 中生成公钥/私钥对,如下所示

    这就是我生成公钥 私钥对的方式 var statusCode OSStatus var publicKey SecKey var privateKey SecKey let publicKeyAttribute NSObject NSObj
  • 扫描仪无法读取整个句子 - 扫描仪类的 next() 和 nextLine() 之间的区别

    我正在编写一个程序 允许用户输入数据然后输出它 它的 3 4 正确 但当它到达输出地址时 它只打印一个单词 让我们只说 Archbishop Street 的 Archbishop 我该如何解决 import java util class
  • 静态初始化顺序惨败

    我在一本书中读到有关 SIOF 的内容 它给出了一个例子 file1 cpp extern int y int x y 1 file2 cpp extern int x int y x 1 现在我的问题是 在上面的代码中 会发生以下情况吗
  • 为什么 CAP_NET_RAW 不能与 SO_BINDTODEVICE 一起使用?

    我有以下简单的测试程序来创建 UDP 套接字并将其绑定到特定接口SO BINDTODEVICE这样我就可以bind it so INADDR ANY专门接收该接口上的 UDP 广播 filename bindtest c include
  • 如何在C++中的cudaDeviceReset()之后重用tensorflow?

    我正在使用 C 开发一个大型 CUDA 应用程序 该应用程序运行各种模型 需要完全释放所有 GPU 内存 否则其他操作将失败 我能够在关闭所有 tf 会话并运行 cudaDeviceReset 后释放所有内存 但之后我无法运行任何新的张量流
  • web.py 处理程序类的参数

    有没有办法将参数传递给 web py 处理程序类构造函数 例如 这些参数可能来自命令行 当运行主 web py 脚本时 位于第一个参数 用作端口号 之后 当然 具体取决于你的意思 毕竟都是Python 考虑你有可用的web config这是
  • dplyr - ifelse 在 mutate 内使用列表

    给定一个数据框df像下面这样 text lt model var value M1 a 12211 M1 b1 10 21 M1 b2 5 07 M1 c1 41 8 M1 c2 58 2 M1 d 1 6 M2 a 11922 M2 b1
  • 什么时候使用 NSDecimal、NSDecimalNumber 而不是 double 更好?

    对于简单的用途 例如跟踪 65 1kg 等重量值 使用 NSDecimal NSDecimalNumber 比使用 double 有什么好处吗 我的理解是 在这种情况下 双精度 甚至浮点 提供了足够的精度 如果我错了 请纠正我 首先 阅读乔
  • 将对象实例替换为 C# 中的另一个对象实例

    在这个问题中 我想知道这是否以及如何可能 这种技术看起来非常糟糕 但似乎我正在使用的 API UnityEditor 正在做类似的事情 我只是好奇 如果对同一个对象有多个引用 是否可以将一个新对象实例化到同一个内存槽中 以便所有先前的引用都
  • 我应该选择哈希、对象还是数组来表示 Perl 中的数据实例?

    我一直想知道这个问题 但从未真正深入研究过 情况是这样的 我有一组比较大的数据实例 每个实例都有相同的集合或属性 例如 a child instance name age height weight hair color favorite
  • 如何在远程Tomcat上部署war

    我想使用 maven tomcat 插件在远程 Tomcat 上部署 WAR 但遇到问题并出现异常 如下所述 请指导 使用的命令 mvn tomcat redeploy 错误日志 ERROR Failed to execute goal o
  • conda init 在 Windows 上的 bash 中不起作用

    我在 Windows 上安装了 Git Bash 和 conda 它提供了两个程序 C Program Files Git git bash exe and C Program Files Git bin bash exe 后者 C Pro
  • 在 Mac OS X 上静态嵌入 Python 时动态符号查找失败

    我正在构建一个嵌入 Python 的 Mac OS X 应用程序 从技术上讲 我的应用程序是一个捆绑包 即它的主要可执行文件是 MH BUNDLE 它是另一个应用程序的插件 我希望它静态嵌入 Python 但希望能够动态加载扩展 我做了以下