“预期在:平面命名空间”是什么意思?

时间:2015-08-28 18:12:57

标签: macos dynamic-linking dyld

OS X动态加载程序经常会出现错误,如

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

如果你search for the error,你会发现很多错误。我粗略地理解这个问题是一个错误的链接,但没有一个答案解释了“平面命名空间”在这里的意思。

3 个答案:

答案 0 :(得分:5)

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

的Prolog

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

<强>扁平的命名空间

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

两级命名空间

在两级命名空间中,不是带有符号名称的普通表,而是使用名称及其库名称保存符号(因此它们来自何处)。依赖于符号的库需要确切地知道它想要从哪个库获得符号XYZ。

这对您的问题意味着什么

中的lib显然是使用flat-namespace选项编译的,并且需要符号 才能正常运行。解决方案是在加载lib之前加载它依赖的库,这会导致问题。

Also有兴趣找到解决问题的方法:

  

在库上运行otool -hV。如果您没有看到TWOLEVEL,那么它   与-flat-namespace链接。

答案 1 :(得分:0)

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

解决方案:

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

重新安装

答案 2 :(得分:0)

卸载:

pip uninstall psycopg2

重新安装:

pip install --no-cache-dir psycopg2