动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败

2024-02-27

我有一个库,我使用 SWIG 创建了一个 python 包装器。该库本身接受用户提供的函数,这些函数位于动态链接的 .so 文件中。目前,我正在处理我自己创建的一个,并设法在 C++ 中使动态链接正常工作。当我尝试在 python 中运行它时,出现未定义的符号错误。这些符号不存在于提供的 .so 文件中,但存在于主程序中(本质上它们是允许提供的模块访问主程序中的数据的函数)。

我在 C++ 中运行一个简短的测试程序没有遇到任何错误,但是使用这个包装器(之前工作过)在 python 中运行一个简短的测试程序失败了。我想不出为什么它在 C++ 中失败而不是在 python 中失败的解释。让我稍微担心的是 C++ 无法正常工作但没有告诉我,并且 python 正在拾取 C++ 没有的错误。然而 C++ 返回的结果是准确的,所以这似乎不太可能。

有什么想法这是可能的,因此我该如何解决它?

Thanks.

更新: 我已将此代码添加到程序的顶部:

import dl
sys.setdlopenflags(dl.RTLD_NOW | dl.RTLD_GLOBAL)

这消除了运行时错误,但不幸的是导致第二个问题出现(仍然是由于链接)。从作为主程序一部分的动态链接库中调用的函数未返回正确的值。它们返回 0。更重要的是,很明显它们根本没有被运行。问题是实际运行的是什么,为什么它与 C++ 不同,以及如何解决这个问题?

再次感谢。

更新-可能更清晰的解释 Python 导入一个模块,这是我的 C++ 库,已被 SWIG 封装。此 C++ 库使用 dlopen 和 dlsym 从用户提供的 .so 文件中获取函数。用户提供了对 C++ 库中的函数的文件调用来完成其工作。从 .so 文件到 C++ 库的函数调用是失败的部分,即它们无法调用该函数,只是返回 0。但是,只有当测试代码是用 python 编写时,才会出现这种失败。使用该库的 C++ 测试代码运行良好。


解决方案是确保 python 在全局范围内预加载 C++ 主库。 这不是一个非常优雅的解决方案,我也不想这样做,但它暂时可以工作。

经过一番探索后here http://linux.die.net/man/8/ld-linux并认识到每次启动终端时都必须设置的 LD_LIBRARY_PATH 环境变量,以便它找到已 SWIGed 的主 C++ 库,我注意到 LD_PRELOAD 环境变量。将其设置为主 C++ 库的文件名后,程序即可运行。

我怀疑这是因为它“可以用来选择性地覆盖其他共享库中的函数”。

如果有人想出比设置环境变量更好的答案,那就太棒了,因为我不确定它的可移植性如何。

编辑:最初的问题是用户提供的库正在寻找的函数不在全局范围内。为了解决这个问题,只需使用 python 的“dl.open”打开主库的 .so 文件,使用 dl.RTLD_NOW 和 dl.RTLD_GLOBAL。

Success!

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

动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败 的相关文章

  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 自动释放:当你被 NARC 逮捕时总是使用吗?

    我知道这个问题看起来像一个骗局 我检查过 但事实并非如此 在谈论 NARC 时 该博客的作者说 http vgable com blog 2010 05 19 n a r c 就我个人而言 我喜欢在同一行立即自动释放我 NARC 编辑的任何
  • 带有 html5 的图像按钮

    我正在尝试制作一个图像按钮 我正在使用 学习 html5 和 jquery mobile 这是我的示例代码 img src img beer png alt beer
  • 检查 bash 脚本中 C 程序的返回值?

    我有一个 bash 脚本 在其中使用 检查上次运行命令的退出代码变量 但现在我正在执行一个 C 程序 来自该脚本 如果程序成功执行 则返回 0 有什么方法可以在我的 bash 脚本中捕获 C 程序的返回值吗 我相信 awk sed 等不同的
  • jQuery 解析/显示来自 php json_encode 的 json 数据

    jquery 中的初始 ajax 调用 ajax type post url items data php data id id dataType json success function data if data make item r
  • 我怎样才能拥有一个同时包含图像和文本的 UIBarButtonItem?

    当我尝试对 UIBarButtonItem 使用图像时 不显示文本 有没有办法同时显示文字和图像 您可以使用具有图像和文本的自定义视图来初始化 UIBarButtonItem 这是一个使用 UIButton 的示例 UIImage chat
  • 在 Angular 中向 ckeditor 添加简单的上传适配器

    我确实通过安装在我的角度项目中启动了经典的ckeditor npm install save ckeditor ckeditor5 angular npm install save ckeditor ckeditor5 build clas
  • 使用 Python(加密)生成 CSR

    我有一个可以工作的骨架 但我有点坚持以下几点 我没有找到使用加密库处理 SAN subjectAltName 的方法 希望我在术语上没有错误 但如果我说 一个主要主机名 test test edu 然后又希望该主机也为 Pushu edu
  • Scala 中两个集合的并集

    从链接的问题来看here https stackoverflow com questions 6963792 scala functional set problem 我在 Scala 中找到了 Union 的实现 def union a
  • 获取合适的VS2017实例进行自主开发扩展

    我正在开发一个 Visual Studio 扩展 以使用从代码窗口中的右键单击上下文菜单调用的自定义命令来替换当前活动 cs 文件中的文本 到目前为止 访问文档是有效的 但如果我启动多个 VS2017 实例 那么我希望在新实例中完成的更改将
  • 在应用程序购买中添加二进制文件

    我已提交新版本的应用程序和新的应用程序购买 苹果有强调新版本的应用程序 但不接受应用程序内购买 应用内购买 新商业模式 我们已开始审核您的应用内购买 但无法继续 因为您提交的应用内购买表明您的应用的业务模式发生了变化 因此 我们需要验证您提
  • 是否有可用于在浮点表示形式之间进行转换的 C++ 库?

    我最近需要解释 DEC 32 位浮点表示 它与 IEEE 浮点表示法的不同之处在于分配给指数和尾数的位数 以下是一堆浮点格式的描述 http www quadibloc com comp cp0201 htm http www quadib
  • docker nginx ERR_NAME_NOT_RESOLVED

    运行 4 个 docker 容器 服务器 客户端 nginx mongo 反向代理 客户端似乎在端口 4200 上工作 我可以看到我的应用程序和路由工作 当尝试注册用户时 我请求将以下 httpclient 发布到名为 myserver 的
  • Excel VBA 宏用于跟踪单独工作表中的更改

    我正在尝试编写一个 VBA 宏来跟踪对单独工作表中工作簿的更改 如果您手动执行此操作 命令顺序为 工具 gt 跟踪更改 gt 突出显示更改 并选择 单独工作表 选项 您必须执行该命令的两次迭代 一次是激活内联跟踪 第二次是将跟踪移动到单独的
  • android:singleLine 的 TextView 不再处于“已弃用”状态?

    我面临 android ellipsize 在 TextView 中不起作用的问题 但要在 android singleLine 上正常工作 我听说 android singleLine 已 弃用 但 Android Developer 的
  • 系统 IO 异常:进程无法访问该文件,因为该文件正在被另一个进程使用 c#

    我已经看到了关于这个问题的几篇文章 我已经实现了所有建议 例如在流写入器和连接对象上使用flush close 方法 使用GC Collect 强制清理 使用using 自动处置 我正在从数据库进行简单的获取操作并写入文本文件 这是我的代码
  • 使用Javascript将所有span标签更改为label标签?

    我想做的 调用卸载函数来更改 span some content span into
  • Rascal 中的布局

    当我导入 Lisra 配方时 import demo lang Lisra Syntax 这将创建语法 layout Whitespace t n r lexical IntegerLiteral 0 9 gt gt 0 9 lexical
  • 使用 GetProcAddress 从 C++ 调用 Delphi DLL:回调函数因参数无效而失败

    我有一个第三方 Delphi DLL 我从 C 调用它 不幸的是 我无法访问 Pascal DLL 代码 并且我不是 Pascal 程序员 没有lib文件 所以我使用GetProcAddress调用许多DLL函数 成功地按值 地址和引用传递
  • WCF 和 HTTP GET

    我的WCF服务公开了这个函数 public SerialNumberInfo GetSerialNumberInfo string serialNumber 有没有办法在我的 WCF 服务上启用 HTTP GET 例子 http local
  • 动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败

    我有一个库 我使用 SWIG 创建了一个 python 包装器 该库本身接受用户提供的函数 这些函数位于动态链接的 so 文件中 目前 我正在处理我自己创建的一个 并设法在 C 中使动态链接正常工作 当我尝试在 python 中运行它时 出