当前位置: 首页 > 面试题库 >

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

齐典
2023-03-14
问题内容

当我导入构建的模块时,出现与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

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


问题答案:

描述

该问题是由于混合使用编译的 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 ++库进行编译。因此,它不适用于任何其他版本。



 类似资料:
  • 问题内容: 什么是PHP命名空间? 一般而言,命名空间是什么? 一个有例子的Layman答案会很棒。 问题答案: Namespacing对函数和类起作用,而作用域对变量起作用。它允许您在同一程序的不同部分中使用相同的函数或类名称,而不会引起名称冲突。 简单来说, 将名称空间视为一个人的姓氏 。如果有两个人名为“ John”,则可以使用他们的姓氏来区分他们。 场景 假设您编写了一个使用名为的函数的应

  • 问题内容: 我刚刚开始学习Python,并在Python中遇到了 “命名空间” 概念。虽然我了解了它的本质,但无法理解这个概念的严重性。 网上的一些浏览显示,反对PHP的原因之一是它没有对名称空间的本地支持。 有人可以解释如何使用名称空间以及此功能如何使编程更好 (不只是在Python中,因为我假设名称空间的概念不限于特定语言)。 我主要来自Java和C编程背景。 问题答案: 命名空间是一种实现范

  • 问题内容: 在以下JavaScript代码中,有一个美元符号()。这是什么意思? 问题答案: 您的代码段看起来像是来自一种流行的JavaScript库(jQuery,ProtoType,mooTools等)的引用方法。 在JavaScript中使用它并没有什么神秘之处。只是一个有效的JavaScript标识符。 JavaScript允许使用大写和小写字母,数字和。在旨在用于机器生成的变量(如)。

  • 问题内容: jQuery中的“ $”符号代表什么? 问题答案: jQuery对象:) 从jQuery文档中: 默认情况下,jQuery使用“ $”作为“ jQuery”的快捷方式 因此,使用)或相同。

  • 在Visual Studio 2015专业版中打开我的项目时,我的所有视图(*. cshtml)中都有以下错误(以及更多)。 错误CS0246找不到类型或命名空间名称“系统”(您是否缺少使用指令或程序集引用?)严重性代码描述项目文件行 错误CS0518预定义类型“系统”。对象“”未定义或导入严重性代码描述项目文件行 错误CS0518预定义类型“系统”。字符串“”未定义或导入 我有这些参考资料: 我

  • 我已经创建了空的ASP.NET核心项目,我想在那里设置角。为此,我需要应用程序服务静态文件。所以我的startup.cs看起来是: 怎么了?