OS X动态加载程序经常会出现错误,如
Symbol not found: <some symbol name>
Referenced from: <lib location>
Expected in: flat namespace
如果你search for the error,你会发现很多错误。我粗略地理解这个问题是一个错误的链接,但没有一个答案解释了“平面命名空间”在这里的意思。
答案 0 :(得分:5)
免责声明:此答案仅适用于macOS 10.4及更高版本。例如。在以前版本的'OSX'中,平面命名空间是默认的。在Windows上 解析也可以稍微不同,具体取决于模式。
让我们先谈谈名称空间的背景。在MacOS中,有两个所谓的命名空间可用。 Two-level namespace和single 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