如何将libpythonX.X中的符号链接到NumPy扩展动态库?

9

我目前遇到一个问题,我可以在解释器环境中使用和导入numpy,但我无法从嵌入在C/C++中的python中导入或使用numpy。因此,我想了解numpy扩展库的工作原理,特别是

numpy/core/multiarray.cpython-35m-x86_64-linux-gnu.so

这与标准的Python包符号(特别是PyExc_UserWarning符号)相关联。我的当前错误输出显示PyExc_UserWarning未定义。我使用nm命令确认它在libpythonX.Y.m.so中存在。

ldd multiarray.cpython-35m-x86_64-linux-gnu.so

并得到以下输出结果:

Console Output

我觉得这个库似乎未链接到应该包含该符号的任何动态库。 numpymultiarray.cpython-35m-x86_64-linux-gnu.so 通常是如何找到该符号或其变体的?

感谢您抽出时间阅读此问题。欢迎提出任何想法、建议或答案!

原始问题位于此处,这是原始问题的子问题。我之所以问这个问题,是因为我怀疑这个共享库可能链接到了错误的位置,并且只有通过 python 的 C/C++ 接口调用 python 时才会使用该特定共享库。

系统规格 + 问题信息

  • Ubuntu 16.04,64 位
  • 使用 enabled-shared 编译 Python 3.5.5
  • 使用命令 pip3.5 install numpy 安装了 numpy-1.14.2(使用 pip 9.0.0)

编辑于 4/16/18:

修改了一些不清晰的术语。

编辑于 4/17/18:

我找到了一个原始问题的答案。但是,这个问题和原来的问题仍然没有解决,因为对这个问题的回答可能会导致更好的答案 原始问题

1个回答

3

multiarray.cpython-35m-x86_64-linux-gnu.so是没有与Python动态库进行明确链接的构建出来的,这就是你无法通过使用ldd看到libpythonx.x.x的原因。

如果你使用nm来检查这个so,你会发现符号PyExc_UserWarning未定义。

因此,当numpy使用dlopen加载这个so时,它将尝试解决这个未定义的符号。我没有找到任何文件解释libdl.so如何解决未定义的符号的规则。但根据我的测试,在使用标志RTLD_NOWdlopen打开一个共享库时,它会为主程序的依赖共享库搜索未定义的符号。

这可能解释了为什么Python可以在没有错误的情况下使用它,因为Python二进制文件已经与libpython.x.x.so链接。


我不再从事这项工作了,但这对我来说似乎是合理的。除非有人反对,否则我会接受。 - skincell
你找到解决方案了吗? - Shanga
2
@Shanga 是的,请查看我在此帖子中的回答 https://dev59.com/GlUL5IYBdhLWcg3wzavS#56018943 - 2power10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接