我目前遇到一个问题,我可以在解释器环境中使用和导入 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
得到如下输出:
在我看来,这个库没有链接到任何应该包含该符号的动态库。 numpy
的 multiarray.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/