我有一个库,我使用 SWIG 创建了一个 python 包装器。库本身接受用户提供的函数,这些函数位于动态链接的 .so 文件中。目前,我正在处理我自己创建的一个,并设法让动态链接工作......在 C++ 中。当我尝试在 python 中运行它时,我得到未定义的符号错误。这些符号是提供的 .so 文件中不存在但存在于主程序中的符号(本质上它们是允许提供的模块从主程序访问数据的函数)。
在 C++ 中运行一个简短的测试程序时我没有遇到任何错误,但是在 python 中使用这个包装器(以前工作过)的一个简短的测试程序失败了。我想不出为什么它会在 C++ 中失败而不是在 python 中的解释。让我稍微担心的是 C++ 不能正常工作但没有告诉我的想法,并且 python 正在发现 C++ 没有的错误。然而 C++ 返回的结果是准确的,所以这似乎不太可能。
任何想法这是怎么可能的,因此我该如何解决它?
谢谢。
更新:我已将此代码添加到程序的顶部:
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++ 测试代码运行良好。