库未加载:/usr/local/opt/readline/lib/libreadline.6.2.dylib

253

我刚刚使用Homebrew安装了postgresql,当我输入命令时,

psql

我得到了以下错误:

dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.2.dylib
Referenced from: /usr/local/bin/psql
Reason: image not found
[1]    69711 trace trap  psql

有人知道出了什么问题吗?


1
看起来它链接到了readline,但是它并不存在。你之后卸载了readline吗?你用homebrew 具体 怎么安装PostgreSQL的?(步骤,命令)。 - Craig Ringer
1
可能已经被 https://dev59.com/ClgQ5IYBdhLWcg3wsGGZ#42377043 解决,该答案比下面的大多数答案更为简洁(您可能不需要重新安装postgres!) - thclark
22个回答

388

我遇到了完全相同的错误,但上面的答案对我没有用。我不得不重新安装postgresql。

brew reinstall postgresql


5
这个在“El Capitan”上为我完成了。 - Sebastian Sastre
6
我的问题似乎与使用brew安装Python有关。 - Guy
7
如果您还没有升级到最新版本的Postgres,请小心操作。您需要在新版本之外重新安装旧版本的Postgres,然后执行pg_upgrade - dazonic
9
如果你不想失去本地数据库,那么这样做就太过武断了。我尝试了使用命令'brew switch readline 6.3.8',运气不错。 - Christopher Johnson
4
如果你认为重新安装psql对于一个看似小问题来说是一个激进的步骤,那么你并不孤单。这个答案:https://dev59.com/tGEi5IYBdhLWcg3wN6Jt#41476592 似乎解决了大多数这些答案绕过的真正问题。 - frandroid
显示剩余10条评论

135
关键问题在于你的postgresql试图查找libreadline.6.2.dylib,但是你的readline版本是7.0,因此只有7的库被链接。
我认为升级postgresql不是一个好主意,这并不容易,并且可能会引起很多问题,特别是当你已经有数据库数据时。
我的解决方法是切换readline的版本。当你检查brew info readline时,你会发现不同的版本,我的是6.3.8,所以我通过执行以下命令来切换到那个版本:
$ brew switch readline 6.3.8

它将升级为6.3.8并创建链接:
Cleaning /usr/local/Cellar/readline/6.3.8
Cleaning /usr/local/Cellar/readline/7.0.1
Opt link created for /usr/local/Cellar/readline/6.3.8

在这种情况下,所有链接的库都变成了6版本,并且命令行可以正常工作:
$ ls /usr/local/opt/readline/lib/
libhistory.6.2.dylib    libhistory.dylib    libreadline.a
libhistory.6.3.dylib    libreadline.6.2.dylib   libreadline.dylib
libhistory.6.dylib  libreadline.6.3.dylib
libhistory.a        libreadline.6.dylib

然而,如果您有不同的应用程序使用不同版本的readline,我认为您应该考虑升级。


更新:06/02/2019

如果旧版本未安装怎么办?

Homebrew 不提供安装旧版本公式的方法。自 v2.0.0 以来,它将默认每 30 天运行 brew cleanup。因此,您可能会意外更新 brew 并删除旧版本。

以下是安装旧版本的步骤:

  1. 进入 homebrew-core 目录:
    $ cd $(brew --repository)/Library/Taps/homebrew/homebrew-core
  1. 检查旧公式的哈希值:
    $ git log master -- Formula/readline.rb

找到对应的哈希值版本。
    commit 1dd4221c35716d6bec363ad3425ef93ffe7d9b9f
    Author: BrewTestBot <brew-test-bot@googlegroups.com>
    Date:   Wed Aug 15 21:51:16 2018 +0000

        readline: update 7.0.5 bottle.

4. 切换至旧公式:
    $ git checkout 1dd4221c35716d6bec363ad3425ef93ffe7d9b9f Formula/readline.rb

重新安装公式:
    $ brew reinstall readline
  1. 重置仓库

按照这些步骤,您可以重新安装旧版本的配方。


1
如果你在 readline 7 上没有其他依赖,那么这绝对是最少干扰的方法。 - drew
这对我也起作用了,让我免于更新PostgreSQL。 - Rich
对我也起作用了...比更新整个数据库干净得多的解决方案。 - sromit
何时需要切换回安装的其他版本的readline?这样做还有哪些缺点? - Kenny Evitt
我只安装了一个 readline,并且我的本地 checkout 的 readline 只包含 8.0 版本,即使获取了所有内容,日志中也没有任何旧版本的提交记录。看起来对我来说不可能安装旧版本的 readline,升级 postgres 可能是唯一的选择。 - Andy Ray
使用安装旧版本的步骤似乎无法帮助安装比7.0.5更旧的版本,因为在任何涉及readline配方的提交中提到的最旧版本就是它。 - Kenny Evitt

79

如果情况是您拥有更高版本的readline,例如7.0,则可以执行以下操作

cd /usr/local/opt/readline/lib    
ln libreadline.7.0.dylib libreadline.6.2.dylib

5
我必须创建一个名为"libreadline.6.dylib"的链接,但这是唯一对我起作用的建议。 - Mads Hoel
1
这个配合 brew uninstall --force gawk 然后 brew install gawk 就让我成功的运行起来了。你也可以尝试使用 brew reinstall --force gawk - Csteele5
1
不错,我正在运行Postgres 10.6,它需要libreadline.7.dylib,但我刚刚安装了 pg_top,它升级了libreadline到8.0并破坏了psql。我使用了你的技巧,只不过将其创建为符号链接 ln -s libreadline.8.0.dylib libreadline.7.dylib - Davos
太好了,谢谢。在MacOS Mojave上运行正常,无需卸载和重新安装PostgreSQL(那将是个真正的痛苦)。 - crmpicco

46
如果您还没有安装readline,请先安装它:brew install readline。对我而言,即使我已经安装了readline,我仍然遇到了此错误。重新安装readline解决了这个问题。
brew reinstall readline

6
重装 readline 没有解决我的问题,但是卸载/安装 bash 解决了:brew install --build-from-source bash - whatbird
我发现我必须先删除所有版本的readline(brew uninstall --force readline)。重新安装后,我必须使用“brew link --force readline”强制链接它。 - Wilhelm
重新安装bash对我也有用,但在我的情况下,“referenced from”行特别提到了bash。 - mbafford
在安装了MacOS Sierra之后,我一直遇到这个问题。我执行了brew reinstall readline(获取Sierra特定的brew),同时也执行了brew reinstall postgresql94。有人说要重新安装bash,但我从未安装过它。所以这个答案和被选中的答案都对我有用。 - risa_risa
在升级到psql9.6后,切换到其他版本(过去有效)不再起作用后,brew reinstall readline对我有用。 - bkunzi01

32

这对我有用

brew switch readline

这将显示您已安装的版本。从中选择一个。我选择了7.0.5

然后我运行了:

brew switch readline 7.0.5

readline 版本已更新,psql 运行顺畅。


2
也对我有用。psql试图加载libreadline.7.dylib,但我正在使用readline 8.0.0。从8.0.0切换到7.0.5解决了问题。我预计创建符号链接(如其他人所做)也可以工作,如果我想保持在8.0.0上。但是,让较新的版本链接到较旧的版本是具有误导性的,并且可能会引起其他问题。 - Dennis
你是怎么找到这个解决方案的?我非常印象深刻! - kuzdu
1
我尝试了相同的操作,但是出现了以下错误:Cellar中没有版本为“7.0.5”的 readline。我尝试使用 brew install 7.0.5 readline 命令进行安装,但是显示以下错误信息:没有名为“7.0.5”的可用公式。 - Mahesh Mesta

23

这对我有用

ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.dylib

这也是我的问题。我没有使用brew,在最新的更新后缺少了符号链接。谢谢! - Matt
好的!我的确出现了6.2版本的错误,但是我的指令略有不同。错误信息是 dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.2.dylib,所以我使用了 ln -s /usr/local/opt/readline/lib/libreadline.7.0.dylib /usr/local/opt/readline/lib/libreadline.6.2.dylib - Tyler Collier

20

解决方案是再次强制链接readline。

brew remove readline
brew install readline
brew link readline --force

重新链接对我没用,但重新安装postgresql解决了问题。 - Konstantin Tikhonov

14

在我看来,问题似乎是关于更新readline包的。在我的情况下,Postgres试图使用 /usr/local/opt/readline/lib/libreadline.7.dylib。因此,我只需为现有版本的库 /usr/local/opt/readline/lib/libreadline.8.dylib 创建一个符号链接即可。

这对我有用:

ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib

这对我有用。我使用的是psql版本9.6.3和readline 8。 - lacostenycoder
诚然,这是一种解决问题的笨办法,但在我进行了一些不相关的升级后,我的 readline 版本从 7 升级到 8,重新安装 Postgres 并不是我现在想要处理的事情。这是一个小型解决方案,readline 中出现重大变化的风险似乎很小,所以我现在选择这个方案并继续前进。如果它在未来引起任何问题,我会回报的。 - Scott Roth
感谢您的评论,我同意这个问题。在更新到macOS Catalina后,我遇到了很多问题,所以我不想深入研究这个问题,而是使用了hack。 - Eugeny Maksimov

8

在我的El Capitan升级到10.11.6后,每次打开终端应用程序都会出现这个错误,已经通过升级bash解决了。 - azul

6

我发现上面的答案对我不起作用,所以我想发布最终奏效的方法。基于我在这里找到的一个线程,我必须卸载readline并再次从源代码安装。

brew uninstall readline
brew install --build-from-source readline

之后,psql错误消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接