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

How are symbols contained in the libpythonX.X linked to numpy extension dynamic libraries?

我目前遇到一个问题,我可以在解释器环境中使用和导入 numpy,但我无法从 [=62= 导入或使用 numpy ] 嵌入 C/C++。所以我很好奇 numpy 扩展库,特别是

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

链接到标准 python 包符号(特别是 PyExc_UserWarning 符号)。我当前的错误输出显示 PyExc_UserWarning is undefined。正如我使用 nm 命令确认的那样,此符号存在于 libpythonX.Y.m.so 中。我运行

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

并得到以下输出:

在我看来,这个库没有链接到任何应该包含该符号的动态库。 numpymultiarray.cpython-35m-x86_64-linux-gnu.so 通常如何找到该符号或多数组的变体如何找到该符号?

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

原题位于。这是原始问题的 sub-question。我问这个问题的原因是因为我怀疑这个共享库可能链接到错误的位置,并且这个特定的共享库仅在通过python调用python时使用C/C++ 接口。

系统规格 + 问题信息

编辑 2018 年 4 月 16 日:

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

编辑 2018 年 4 月 17 日:

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

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

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

所以当 numpy 使用 dlopen 加载它时,它会尝试解析这个未定义的符号。我没有找到任何文档解释 libdl.so 如何解析未定义符号的规则。但是根据我的测试,当你尝试打开一个共享库使用 dlopen 和标志 RTLD_NOW,它会搜索主程序的依赖共享库以寻找未定义的符号。

这可以解释为什么 python 可以毫无错误地使用它,因为 python 二进制文件是 link 与 libpython.x.x.so 编辑的。