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

C++ 动态链接和Python SWIG(C+;+;)在C++;在python中失败,c++,python,swig,dynamic-linking,C++,Python,Swig,Dynamic Linking,我有一个库,我使用SWIG为它创建了一个python包装器。库本身接受用户提供的函数,这些函数位于动态链接的.so文件中。目前,我正在处理一个我自己创建的,并设法使动态链接工作。。。在C++中。当我尝试在python中运行它时,会出现未定义的符号错误。这些符号不存在于提供的.so文件中,但存在于主程序中(基本上是允许提供的模块从主程序访问数据的函数) < >我在C++中运行一个简短的测试程序没有任何错误,但是Python中的一个简短的测试程序(这个包以前工作过)失败了。我想不出为什么它会在C++

我有一个库,我使用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和DLSIM从用户提供的函数获取文件。用户提供的文件调用函数是C++库的一部分,以便完成它的工作。从.so文件到C++库的函数调用是失败的部分,也就是说,它们不能调用函数,只返回0。但是,只有当测试代码是用python编写的时,才会发生此故障。使用该库的C++测试代码工作良好。

< P> Python解释器可能正在加载您的包装器。因此,不使其符号可用于其他动态链接库(以避免符号冲突)。尝试在导入包装器之前添加以下行:

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

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

在我开始启动终端后,我在一点点的拨弄和识别LD-LabyLogyPATH环境变量,以便它甚至能找到被跳过的主C++库时,我注意到了LDHPyLoad环境变量。当将它设置为主C++库的文件名时,程序就工作了。 我怀疑这是因为它“可以用来选择性地重写其他共享库中的函数”

如果有人能想出一个比设置环境变量更好的答案,那就太棒了,因为我不知道这有多方便

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


成功

谢谢,这确实可以消除运行时错误,但不幸的是,它会导致另一个错误。代码现在无法正常运行,经过一点调试后,发现.so文件试图调用的主程序中的函数实际上没有被调用。更改返回值,甚至将控制台输出放入返回值中都没有任何区别。他们只是返回0。救命啊!我对你的代码结构有点不清楚。具体地说,我假设“主程序”实际上是Python解释器(也就是说,您没有嵌入它),并且您正在尝试加载一个.so,它是编译时与另一个.so动态链接的(不是通过dlopen()动态加载的),但这很难说。你能不能说得更具体一点,这些组件是什么,它们是如何连接在一起的?对不起,我不是故意不清楚的!Python导入一个模块,它是一个被SWIG包裹的C++库。这个C++库使用DLOPEN和DLSIM从用户提供的函数获取文件。用户提供的文件调用函数是C++库的一部分,以便完成它的工作。从.so文件到C++库的函数调用是失败的部分,也就是说,它们不能调用函数,只返回0。但是,只有当测试代码是用python编写的时,才会发生此故障。使用库的C++测试代码。这是一个相当不寻常的关联场景。可能值得尝试使用
dl
模块显式加载用户提供的。因此(请确保首先设置dl.RTLD_全局标志)。这将导致链接器将C++库加载为依赖项,希望能够确保所有符号都得到妥善处理。我没想到会出现你一开始描述的问题,所以我现在只是在猜测。我可以肯定地说,运行时链接配置是问题所在。我已经尝试过了,并且使用DLOPEN打开主C++库和用户提供的库。仅打开主库并不能解决此问题。此外,打开用户提供的库实际上会导致原始问题返回(无法找到主库中存在的符号),即使主库