python - libpythonX.X 中包含的符号如何链接到 numpy 扩展动态库?

标签 python c++ python-3.x numpy shared-libraries

我目前遇到一个问题,我可以在解释器环境中使用和导入 numpy,但我无法从中导入或使用 numpy嵌入 C/C++ 中的 python。所以我很好奇 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 通常如何找到该符号或 multiarray 的变体如何找到该符号?

感谢您抽空阅读这个问题。任何想法、建议或答案都将不胜感激!

原题位于here .这是原始问题的子问题。我问这个问题的原因是因为我怀疑这个共享库可能链接到错误的位置,而这个特定的共享库仅在通过python C/C++ 调用python时使用> 接口(interface)。

系统规范+问题信息

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

编辑 2018 年 4 月 16 日:

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

编辑 2018 年 4 月 17 日:

我找到了原始问题的答案;然而,这个问题和原来的问题仍然悬而未决,因为这个问题的答案可能会导致对 original problem 的更好答案。 .

最佳答案

multiarray.cpython-35m-x86_64-linux-gnu.so是在没有与 python 动态库的显式链接的情况下构建的,这就是为什么使用 ldd 看不到 libpythonx.x.x 的原因。

如果您使用 nm 进行检查,您将看到符号 PyExc_UserWarning未定义。

所以当 numpy 使用 dlopen 加载它时,它会尝试解析这个 undefined symbol 。我没有找到任何文件解释规则如何 libdl.so解析 undefined symbol 。但根据我的测试,当您尝试打开共享库时使用 dlopen带标志 RTLD_NOW ,它会在主程序依赖的共享库中搜索 undefined symbol 。

这可以解释为什么 python 可以毫无错误地使用它,因为 python 二进制文件与 libpython.x.x.so 链接.

关于python - libpythonX.X 中包含的符号如何链接到 numpy 扩展动态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866263/

相关文章:

python - python类的所有语句在没有对象创建的情况下执行

python - for 循环中未使用的变量

c++ - 如何为返回数组引用的方法使用 cv 限定符?

Python:带参数的队列方法 wait_for 谓词

python - 与 sleep 命令相比,使用循环在 python 中等待更多 CPU 密集型?

python - 在 lxml objectify python 中将 int 元素更改为 str 元素

python - 使用 Flask 或 Quart NameError : global name 'g' is not defined

c++ - SQL Server 2012 通过 native C++(无 ATL)从 Windows 首选访问方法

c++ - Visual Studio 总是中断 "Floating-point inexact result"

python - async - sync - 一个 python 事件循环中的异步调用