动态链接和 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 中失败 的相关文章

随机推荐

  • 自动释放:当你被 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 中运行它时 出