如何解决“找不到符号/在以下位置期望:平面名称空间”的实际含义是什么?
描述
该问题是由于混合使用编译的 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的两个版本是不好的,请考虑以下情况:有两个库:Foo
和Bar
。它们都具有接受astd::string
并将其用于某些东西的函数,但是它们使用不同的c库。当一个std::string
由创建的对象Foo
将被传递给时Bar
,Bar
会认为这是其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 举报,一经查实,本站将立刻删除。