微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“找不到符号/在以下位置期望:平面名称空间”的实际含义是什么?

如何解决“找不到符号/在以下位置期望:平面名称空间”的实际含义是什么?

描述

该问题是由于混合使用编译的 libc++ 对象和使用编译的对象引起的 libstdc++

在我们的例子中,(从myMod.so编译 libstdc++ )的库需要从(从现在开始)boost- python编译的库。如果是,它将正常工作。否则-在其编译过的计算机(或其他c ++库)上,它将在加载和运行时出现问题。libstdc++boost-python-libstdc++``boost-python``boost-python- libstdc++``boost-python libc++

在我们的案例中,发生这种情况是因为 libc++ 开发人员有意更改了所有符号的名称,以防止您(并保存您)将库中的代码与其他库中的代码混合:myMod.so需要一个从类型中获取参数的函数。在中libc++,此类型的名称std::__1::pair。因此,找不到此符号。

要了解为什么混合使用同一API的两个版本是不好的,请考虑以下情况:有两个库:FooBar。它们都具有接受astd::string并将其用于某些东西的函数,但是它们使用不同的c库。当一个std::string由创建的对象Foo将被传递给时BarBar会认为这是其c库的一个实例,std::string然后可能发生不好的事情(它们是完全不同的对象)。

:在某些情况下,同一API的两个或多个不同版本在程序的完全不同的部分中不会出现问题。如果它们将在它们之间传递此API的对象,则会出现问题。但是,检查可能非常困难,尤其是当它们仅作为另一个对象的成员传递API对象时。而且,库的初始化功能可以完成不应重复执行的操作。另一个版本可能会再次执行这些操作。

怎么解决呢?

  • 您始终可以重新编译您的库,并使它们相互匹配。

  • 您可以boost-python作为静态库链接到您的库。然后,它将在几乎每台计算机上运行(甚至没有boost-python安装的计算机)。在这里查看更多信息。

概要

myMod.so需要另一种版本的boost-python,可以使用特定的c ++库进行编译。因此,它不适用于任何其他版本。

解决方法

当我导入构建的模块时,出现与boost-python相关的错误:

Traceback (most recent call last):
  File "<string>",line 1,in <module>
ImportError: dlopen(./myMod.so,2): Symbol not found: __ZN5boost6python7objects15function_objectERKNS1_11py_functionERKSt4pairIPKNS0_6detail7keywordES9_E
  Referenced from: ./myMod.so
  Expected in: flat namespace
 in ./myMod.so

这到底是什么意思?为什么会引发此错误?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。