Python 和 libstdc++ 的动态库问题

2024-04-15

执行摘要:Python 模块链接到不同版本的libstdc++.dylib比 Python 可执行文件。结果是调用iostream从模块崩溃。

背景故事

我正在一台旧计算机(运行 10.5.8)上使用 SWIG 创建一个 Python 模块。由于各种原因,我使用 GCC 4.5(通过 MacPorts 安装)来执行此操作,使用 Python 2.7(通过 MacPorts 安装,使用系统默认的 GCC 4.0.1 编译)。

观察到的行为

长话短说:打电话str( myObject )在Python中会导致C++代码依次调用std::operator<< <std::char_traits<char> >。这会产生以下错误:

Python(487) malloc: *** error for object 0x69548c: Non-aligned pointer being freed
*** set a breakpoint in malloc_error_break to debug

设置断点并调用backtrace当它失败时给出:

#0  0x9734de68 in malloc_error_break ()
#1  0x97348ad0 in szone_error ()
#2  0x97e6fdfc in std::string::_Rep::_M_destroy ()
#3  0x97e71388 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string ()
#4  0x97e6b748 in std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow ()
#5  0x97e6e7a0 in std::basic_streambuf<char, std::char_traits<char> >::xsputn ()
#6  0x00641638 in std::__ostream_insert<char, std::char_traits<char> > ()
#7  0x006418d0 in std::operator<< <std::char_traits<char> > ()
#8  0x01083058 in meshLib::operator<< <tranSupport::Dimension<(unsigned short)1> > (os=@0xbfffc628, c=@0x5a3c50) at /Users/sethrj/_code/pytrt/meshlib/oned/Cell.cpp:21
#9  0x01008b14 in meshLib_Cell_Sl_tranSupport_Dimension_Sl_1u_Sg__Sg____str__ (self=0x5a3c50) at /Users/sethrj/_code/_build/pytrt-gcc45DEBUG/meshlib/swig/mesh_onedPYTHON_wrap.cxx:4439
#10 0x0101d150 in _wrap_Cell_T___str__ (args=0x17eb470) at /Users/sethrj/_code/_build/pytrt-gcc45DEBUG/meshlib/swig/mesh_onedPYTHON_wrap.cxx:8341
#11 0x002f2350 in PyEval_EvalFrameEx ()
#12 0x002f4bb4 in PyEval_EvalCodeEx ()
[snip]

疑似问题

我认为问题在于我的代码链接到新版本的 libstdc++:

/opt/local/lib/gcc45/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.14.0)

而Python二进制文件对系统有非常间接的依赖libstdc++,首先加载(输出来自info shared在 gdb 中):

  1 dyld                  - 0x8fe00000        dyld Y Y /usr/lib/dyld at 0x8fe00000 (offset 0x0) with prefix "__dyld_"
  2 Python                - 0x1000            exec Y Y /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python (offset 0x0)
                                          (objfile is) /opt/local/bin/python
  3 Python                F 0x219000          dyld Y Y /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python at 0x219000 (offset 0x219000)
  4 libSystem.B.dylib     - 0x9723d000        dyld Y Y /usr/lib/libSystem.B.dylib at 0x9723d000 (offset -0x68dc3000)
                                 (commpage objfile is) /usr/lib/libSystem.B.dylib[LC_SEGMENT.__DATA.__commpage]
  5 CoreFoundation        F 0x970b3000        dyld Y Y /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation at 0x970b3000 (offset -0x68f4d000)
  6 libgcc_s.1.dylib      - 0x923e6000        dyld Y Y /usr/lib/libgcc_s.1.dylib at 0x923e6000 (offset -0x6dc1a000)
  7 libmathCommon.A.dylib - 0x94af5000        dyld Y Y /usr/lib/system/libmathCommon.A.dylib at 0x94af5000 (offset -0x6b50b000)
  8 libicucore.A.dylib    - 0x97cf4000        dyld Y Y /usr/lib/libicucore.A.dylib at 0x97cf4000 (offset -0x6830c000)
  9 libobjc.A.dylib       - 0x926f0000        dyld Y Y /usr/lib/libobjc.A.dylib at 0x926f0000 (offset -0x6d910000)
                                 (commpage objfile is) /usr/lib/libobjc.A.dylib[LC_SEGMENT.__DATA.__commpage]
 10 libauto.dylib         - 0x95eac000        dyld Y Y /usr/lib/libauto.dylib at 0x95eac000 (offset -0x6a154000)
 11 libstdc++.6.0.4.dylib - 0x97e3d000        dyld Y Y /usr/lib/libstdc++.6.0.4.dylib at 0x97e3d000 (offset -0x681c3000)
 12 _mesh_oned.so         - 0x1000000         dyld Y Y /Users/sethrj/_code/_build/pytrt-gcc45DEBUG/meshlib/swig/_mesh_oned.so at 0x1000000 (offset 0x1000000)
 13 libhdf5.7.dylib       - 0x122c000         dyld Y Y /opt/local/lib/libhdf5.7.dylib at 0x122c000 (offset 0x122c000)
 14 libz.1.2.5.dylib      - 0x133000          dyld Y Y /opt/local/lib/libz.1.2.5.dylib at 0x133000 (offset 0x133000)
 15 libstdc++.6.dylib     - 0x600000          dyld Y Y /opt/local/lib/gcc45/libstdc++.6.dylib at 0x600000 (offset 0x600000)
[snip]

请注意,malloc系统内存地址发生错误libstdc++,而不是共享库所链接的那个。

尝试的解决方案

我尝试强制 MacPorts 使用 GCC 4.5 而不是 Apple 编译器构建 Python,但安装阶段失败,因为它需要创建 Mac“框架”,而普通 GCC 显然不这样做。

即使与-static-libstdc++编译器标志,__ostream_insert 调用std::basic_streambuf来自系统加载的共享库。

我尝试通过前置来修改 DYLD_LIBRARY_PATH/opt/local/lib/gcc45/但无济于事。

我该怎么做才能让它发挥作用?我已经无计可施了。

更多信息

这个问题似乎是。请注意,在所有调试输出中,地址如何在调用之间跳转std::__ostream_insert and std::basic_streambuf::xsputn:它将离开新的 GCC 4.5 代码并跳转到旧的共享库代码/usr/bin。现在,要找到解决方法...


解决了。我发现在 Mac 上混合 GCC 版本时这个问题并不少见。看完之后这个解决方案适用于 mpich http://www.mail-archive.com/libmesh-users@lists.sourceforge.net/msg02756.html并检查mpich 源代码 http://anonscm.debian.org/gitweb/?p=debian-science/packages/mpich2.git;a=blob_plain;f=configure;hb=HEAD,我发现解决方案是在mac系统上的gcc中添加以下标志:

-flat_namespace

我太高兴了。我希望这没有花费我一周的时间才弄清楚。 :)

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

Python 和 libstdc++ 的动态库问题 的相关文章

  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • 在 python-docx 中搜索和替换

    我有一个包含以下字符串的文档 模板 你好 我的名字是鲍勃 鲍勃是一个很好的名字 我想使用 python docx 打开此文档并使用 查找和替换 方法 如果存在 来更改每个字符串 Bob gt Mark 最后 我想生成一个新文档 其中包含字符
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • 如何将类作为 ASP.NET MVC htmlAttributes 的键值对传递?

    我想使用 Html TextBox FullName null new 在 ASP NET MVC 中为我的输入框传递 html 输入类属性class 灰色输入 但我想我可以使用 class 关键字 我怎样才能绕过这个问题 是的 您需要使用
  • 在 MacOS 上从源代码构建 gdb

    我正在尝试在 Apple M1 MacBook 上安装交叉编译的 gdb 我下载了 gdb 11 1 并执行了以下操作 tmp src gdb 11 1 configure enable targets all make sudo make
  • 在 JavaScript 正则表达式中链接多个正向前瞻

    我是学习正则表达式的新手 我遇到了这个答案 https stackoverflow com questions 14850553 javascript regex for password containing at least 8 cha
  • Python中使用递归获取列表的长度

    我正在尝试计算列表的长度 当我在cmd上运行它时 我得到 RuntimeError maximum recursion depth exceeded in comparison 我不认为我的代码有什么问题 def len recursive
  • 捕获不带 \n 的输入

    我正在终端中制作一个简单的 2d 游戏 我一直想知道如何获得标准输入而不必返回 因此 用户不必按 w n n 用于返回 而只需按 w 即可前进 scanf gets 和 getchar 无法做到这一点 但我以前见过在 Vi 等程序中做到过
  • 如何使用 Invoke-Sqlcmd 连接到 SQL Server LocalDB?

    I have sqlcmd exe来自 SQL Server 2008 和 SQL Server 2012 PS C gt Get Command sqlcmd exe Definition C Program Files Microsof
  • 使用散景滑块滑动图像

    我试图在滑块的帮助下无缝地传达大量科学数据 我从 Bokeh 开始 对 javascript 几乎一无所知 我尝试设置第一种方法来滑动两个图像 但我无法刷新图像 假设我的文件夹中有 1 png 和 2 png from bokeh io i
  • 在 Visual Studio 中编译时如何将 DLL 保存在不同的文件夹中?

    假设我有一个窗口表格 控制台应用程序 C 与一些项目外部参考以及对同一解决方案中其他类库项目的引用 当我构建窗口形式项目 我希望引用的库存储在不同的位置 eg bin 发布 库 并且与 exe 不在同一文件夹中 可以做吗 您的问题有两部分
  • python 3 替代 dircache?

    在我重新发明轮子之前 谁能告诉我是否有单行语句的直接 或半直接 替代 allfiles dircache listdir 一条线 不 但你可以这样做 global cache def cached listdir path res glob
  • PHP 扰乱了 HTML 设计并在 HTML 之外显示结果

    我不确定为什么会发生这种情况 我在 HTML 或其他任何方面都不是 那么好 我主要假设我的问题是如何显示结果 任何提示 帮助 或建议都非常感谢 该脚本基本上是一个简单的 FoodManagement 类 它管理食物 哈哈 这是代码 inde
  • 未定义变量 - Switch 语句在 PHP 中是否具有作用域

    大家好 这是我第一次发帖 认为这会很好 因为我完全陷入困境 据我了解 PHP 中的 switch 和 If else 语句没有变量范围 我的问题是我有一个 CSV 文件 示例文件 其中包含大约 5 行值 我需要将其放入 mySQL DB 表
  • 从文件中动态读取资源

    我一直使用 resx 文件作为静态字符串 以便有一个中心位置来更改它们 问题是在项目构建和部署后我无法更改它们 我想在部署后更改一些字符串 而不重新启动进程 因此 config 文件已退出 可以编写有效解析配置文件 XML JSON YAM
  • 什么可能导致 PUSHD 失败?

    我有一个很棒的大脚本 完全依赖于 PUSHD 然而当我打字时突然pushd server1 dir1我越来越 C Documents and Settings userNameHere gt pushd server1 dir1 CMD d
  • 如何在底部屏幕上实现可滚动选项卡

    Newsvoice 在屏幕底部的底部栏顶部有一个可滚动的选项卡 我怎样才能实现这个用户界面 谢谢 这是一些使用的示例代码Column定位可滚动的TabBar and a BottomNavigationBar in the bottomNa
  • SetInterval 是否在单独的线程上运行?该方法如何运作?

    我环顾四周试图了解如何SetInterval但只找到了如何使用它 我已经知道它的功能 我只是好奇当 JS 不支持线程时它如何能够在单独的线程上运行某些东西 至少这是我读到的 我希望我正确地提出了这个问题 Thanks setInterval
  • 从 char* 初始化 std::string 而不复制

    我遇到一种情况 我需要处理大量 许多 GB 数据 如下所示 通过附加许多较小的 C char 字符串来构建一个大字符串 修剪绳子 将字符串转换为 C const std string 进行处理 只读 repeat 每次迭代中的数据都是独立的
  • 如何使对象通过拖动旋转,如何使用sin或cos获得围绕原点的旋转点?

    我已经搜索了很长时间 但找不到更好的方法来解决我的问题 使 div 可通过每个手柄拖动 旋转和调整大小 如这 2 个示例1 http vremenno net examples jquery ui rotation 2 http fabri
  • 从Superview 中删除不起作用

    我需要能够从视图中删除一个按钮并添加另一个按钮 我的代码如下所示 void UpdatePromoBanner NSString value button setTitle newer text forState UIControlStat
  • 如何根据“^P”分隔符分隔的数据构建 Hive 表

    我的查询是 CREATE EXTERNAL TABLE gateway staging poll int total int transaction id int create time timestamp update time time
  • Python 和 libstdc++ 的动态库问题

    执行摘要 Python 模块链接到不同版本的libstdc dylib比 Python 可执行文件 结果是调用iostream从模块崩溃 背景故事 我正在一台旧计算机 运行 10 5 8 上使用 SWIG 创建一个 Python 模块 由于