"expected in: flat namespace" 是什么意思?

What does "expected in: flat namespace" mean?

OS X 动态加载器经常给出像

这样的错误
Symbol not found: <some symbol name>
Referenced from: <lib location>
Expected in: flat namespace

如果您 search for the error 您会发现大量错误。我大致理解问题是链接不正确,但是 none 的答案准确地解释了 "flat namespace" 在这里的含义。

免责声明:此答案仅适用于 macOS 10.4 及更高版本。例如。在以前的版本中 'OSX' flat-namespaces 是默认值。在 Windows 解析也可能略有不同,具体取决于模式。

序言

先说说命名空间的产生背景。在 MacOS 中有两个可用的 so-called 命名空间。 Two-level namespace and single namespace(也称为 flat-namespace)。

Flat-namespace

每个进程都有一个巨大的table,其中包含所有符号(函数,外部变量,..)。当一个库被加载时,它可能依赖于一个符号,因此可以在 flat-namespace 中查找其他库或 executable 'offers' 它。找到所有符号后,库将自己的符号添加到列表中。一个巨大的缺点是可能发生的碰撞数量。一个进程可能会加载两个或多个具有相同符号名称的库。这取决于 OS 如何处理冲突,但在大多数情况下,它只是未定义的行为,并且由于混合库而导致崩溃。

Two-level 命名空间

在 two-level 命名空间中,而不是带有符号名称的普通 table,符号以名称和它们的库名称(它们来自哪里)保存。依赖符号的库需要确切地知道它希望从哪个库中解析符号 XYZ。

这对您的问题意味着什么

该库显然是使用 flat-namespace 选项编译的,并且正确地需要符号 到 运行。一个解决方案是在加载导致问题的库之前加载它所依赖的库。

Also 找到问题的解决方案很有趣:

Run otool -hV on the library. If you don't see TWOLEVEL, then it was linked with -flat-namespace.

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

解决方案:

删除 psycopg2-binary 并使用 --no-cache-dir

重新安装

卸载:

pip uninstall psycopg2

重新安装:

pip install --no-cache-dir psycopg2