【问题标题】:What does "expected in: flat namespace" mean?“预期在:平面命名空间”是什么意思?
【发布时间】:2015-08-28 18:12:56
【问题描述】:

OS X 动态加载器经常给出类似的错误

Symbol not found: <some symbol name>
Referenced from: <lib location>
Expected in: flat namespace

如果您search for the error,您会发现大量错误。我大致了解问题是不正确的链接,但是没有一个答案可以准确地解释“平面命名空间”的含义。

【问题讨论】:

  • 嗨,当我从具有该 dylib 使用的符号的可执行文件中链接 dylib 时,我遇到了同样的错误。如果我在调试模式下在 Xcode 中编译可执行文件,它可以工作..但切换到发布模式,并且该过程拒绝以您提到的相同错误开始。知道是什么触发了这个吗?

标签: macos dynamic-linking dyld


【解决方案1】:

免责声明:此答案仅适用于 macOS 10.4 及更高版本。例如。在以前版本的“OSX”中,平面命名空间是默认的。在 Windows 上 解析的工作方式也可能略有不同,具体取决于模式。

序言

我们先来说说命名空间的背景。在 MacOS 中,有两个所谓的命名空间可用。 Two-level namespacesingle namespace(也称为平面命名空间)。

平面命名空间

每个进程都有一个包含所有符号(函数、外部变量……)的巨大表。当一个库被加载时,它可能依赖于一个符号,因此可以在平面命名空间中查找哪个其他库或可执行文件“提供”它。找到所有符号后,库将他自己的符号添加到列表中。一个巨大的缺点是可能的碰撞数量。一个进程可能会加载两个或多个具有相同符号名称的库。如何处理冲突取决于操作系统,但在大多数情况下,这只是未定义的行为,并且由于库的混合而导致崩溃。

两级命名空间

在两级命名空间中,符号不是带有符号名称的普通表,而是与名称及其库名称一起保存(因此它们来自哪里)。依赖于符号的库需要准确地知道要从哪个库中解析符号 XYZ。

这对您的问题意味着什么

该库显然是使用平面命名空间选项编译的,并且需要符号 才能正常运行。一种解决方案是在加载导致问题的库之前加载它所依赖的库。

Also很想找到解决您问题的方法:

在库上运行 otool -hV。如果你没有看到TWOLEVEL,那么它 已与-flat-namespace 关联。

【讨论】:

  • 符号查找的背景使这个错误更容易理解。谢谢你。
【解决方案2】:

我在 macOS Big Sur 上尝试运行 psycopg2-binary 时遇到了错误。

解决方案:

删除 psycopg2-binary 并使用 --no-cache-dir 重新安装

【讨论】:

    【解决方案3】:

    卸载:

    pip uninstall psycopg2
    

    重新安装:

    pip install --no-cache-dir psycopg2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 2012-01-21
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2012-02-10
      相关资源
      最近更新 更多