带有嵌入式 Python 的 Python 扩展模块调用了错误的库

Python extension module with embedded python calls wrong library

本文关键字:Python 错误 调用 扩展 嵌入式 模块      更新时间:2023-10-16

我有一个python扩展模块(2.7((由swig生成(,它本身链接到链接到Python 3.33的库。甚至模块也链接到版本 3.33,当它实例化时,它会调用 2.7 定义的 PyFunc,而不是 3.33 中定义的 PyFunc。这只发生在Linux上,并且在Windows上效果很好。我是否需要传递特定的链接器标志以避免此类问题?

谢谢!

在 Windows 下,DLL(类似于 Linux 共享对象(必须在链接阶段解析其所有外部符号,因此在构建扩展期间,扩展与 python 3.0 DLL 隐式链接,一切正常(没有看到 MSVC 命令行,我几乎可以肯定扩展与位于类似 c:/python33/libs/python33.lib 的存根库链接

(

另一方面,在 Linux 下,共享对象默认链接制度不会解析所有外部符号,因此 -lpython 的 LD 规范可能会在运行时解析为基于 2.7 的加载共享对象......

所以你有2个选择:

  1. 由于您获得了源代码,因此在Linux下,您可以通过dlopen动态加载 libpython33.so 以避免这种"DLL地狱">

  2. 静态方法,您应该指定 python3.3 的确切位置,即而不是"模糊"的-lpython(解析为 python2.7(类似/usr/lib/python3.3/libpython33.so