dyld:库未加载:/usr/local/lib/libjpeg.8.dylib - Homebrew PHP

110

由于我遇到了这个libpng问题,PHP对我来说无法正常工作,因此我使用Homebrew重新安装了一个新版本。

不过,这一次我遇到了相似的libjpeg错误:

$ php -v
dyld: Library not loaded: /usr/local/lib/libjpeg.8.dylib
  Referenced from: /usr/local/bin/php
  Reason: image not found
Trace/BPT trap: 5

有什么建议吗?


brew doctorbrew list的输出是什么? - IKavanagh
15个回答

252

如@jirson-tavera在homebrew-php问题存储库中提出的那样,这可以在不覆盖brew安装的情况下解决:

wget -c http://www.ijg.org/files/jpegsrc.v8d.tar.gz
tar xzf jpegsrc.v8d.tar.gz
cd jpeg-8d
./configure
make
cp ./.libs/libjpeg.8.dylib /usr/local/opt/jpeg/lib

4
除非进行一些微小的修改以使其更加完善,否则这应该被接受为答案。 - Koen Betsens
也对我有用。谢谢。 - Adrian Lynch
也对我有用。干杯。 - Eduardo
19
考虑采用“正确的方式”来完成。 - sepehr
我无法执行 brew switch 命令来降级 libjpeg 版本,因为它会报错 switch 命令不被支持。所以我只能选择这种方法。 - liushuaikobe
显示剩余2条评论

170

尽管被接受的答案中的解决方案可行,但这并不是修复问题的正确方式。它会破坏brew的元数据完整性。

问题

问题在于Homebrew的jpeg配方已升级到v9,但现有的“bottled” PHP配方仍然构建并链接到先前的版本v8,而该版本在您的系统上已不存在。

您有几个选项来解决此问题。

1. 从源代码重新编译phpxx配方(强烈推荐)

卸载您的PHP配方,并从源代码重新构建它,而不是使用瓶装版本。这样,PHP将使用并链接当前安装的版本jpeg。假设您正在处理php71

brew reinstall php71 --build-from-source

2. 降级 jpeg 公式的正确方法 (优先于手动重新编译)

如果您还没有运行brew cleanup,则已经在Homebrew的库中获取了先前的jpeg版本,请切换到它:

brew switch jpeg 8d

如果你收到一个 jpeg does not have a version "8d" in the Cellar. 的错误,那么你需要首先通过还原历史记录来修复它:

cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core
git checkout b231469
HOMEBREW_NO_AUTO_UPDATE=1 brew install jpeg
git checkout master

brew switch jpeg 8d

通过使用brew log jpeg并浏览提交消息,您可以找出提交哈希值。

缺点是可能有其他需要较新版本才能正常工作的公式,例如imagemagick。如果遇到此类不兼容问题,请检查上面的第一个解决方案。

3. 通过手动重新编译降级 jpeg (不推荐)

获取源代码、编译并覆盖brew的版本。有关详细信息,请参阅Denis' answer

这样做是不推荐的,因为它会破坏你的brew元数据的完整性。Brew认为它有8b版本,但实际上你手动编译了9b并覆盖了文件。

4. 手动创建旧版本的符号链接 (真的吗?)

不要手动创建剩余的libjpeg.8.dylib符号链接。如果该文件存在,则可以根据上面第二个解决方案中提到的方法进行brew switch

这只是在此处可以做的最糟糕的hack。


此类问题最终将会被修复


4
这应该几乎肯定是被采纳的答案。 - Mike Legacy
方法2无法再找到提交记录,可能是因为强制推送的原因。解决方法:不要使用git checkout b231469,而是使用curl https://raw.githubusercontent.com/Homebrew/homebrew-core/b23146936a3abb57aabb39017561e7b0c750abbf/Formula/jpeg.rb > Formula/jpeg.rb,然后用git checkout Formula/jpeg.rb代替git checkout master - tuomassalo
@tuomassalo 感谢您分享您的解决方案。此提交 在我的本地克隆仍然存在。如果这是由于强制推送而导致的,您也无法使用 curl 获取它。在我看来,似乎您的本地克隆与远程仓库不同步。 - sepehr
@sepehr你是正确的:我的本地副本没有全部历史记录。现在我再试一次,手动克隆代码库并检出'b23...'就可以了。 - tuomassalo
2
如果执行 git checkout b231469 出错,那么首先尝试执行 git -C "$(brew --repo homebrew/core)" fetch --unshallow - Yoshi
显示剩余2条评论

12

今天我遇到了类似的问题,问题的原因是使用了更新版本的libjpeg。解决方法是从源代码构建php

检查可用的libjpeg版本:

$brew info libjpeg
jpeg: stable 9b (bottled)
Image manipulation library
http://www.ijg.org
/usr/local/Cellar/jpeg/9b (20 files, 724KB) *
  Poured from bottle on 2017-08-07 at 12:06:42
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/jpeg.rb

从源码安装php

brew install --build-from-source php56

更新
如果您已经安装了php,在从源代码构建之前必须先卸载它。这也适用于扩展。


刚才我也遇到了同样的问题 - 到底发生了什么?brew更新了libjpeg,现在它的版本不适用于php5.6? - Toby
顺便提一下,你的回答输出为: 警告:josegonzalez/php/php56 5.6.30_6 已经安装可能应该先删除它?感觉有点可怕 :P - Toby
是的,您必须卸载 php 和其扩展。然后使用 --build-from-source 安装 php。我查看了 libjpeg 公式的 git 历史记录,libjpeg 的版本于8月5日更新为 9b 版本。 - pwc
很好,这样有点儿出问题了...不过编译已经完成了。现在看起来它又能正常工作了 - 谢谢 :) - Toby
这对于PHP 7.1同样有效,只需卸载然后运行brew install --build-from-source php71。在我今晚运行brew upgrade之后出现了问题。 - Dwight

7

我试图升级composer时遇到了类似的问题:

dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.8.dylib
Referenced from: /usr/local/bin/php
Reason: image not found
composer: PHP Phar support is required for this formula
Error: An unsatisfied requirement failed this build.

问题在于php无法再找到libjpeg库。解决方法之一是重新安装phplibjpeg。以下是我的重新安装步骤:

# find out which version of php is installed
brew list | grep php

# uninstall php
brew uninstall php70 --ignore-dependencies

# uninstall libjpeg
brew uninstall libjpeg --ignore-dependencies

# install libjpeg again
brew install libjpeg

# install php again
brew install php70

我随后能够再次升级所有东西 :)

brew update && brew upgrade


6

我曾经遇到过同样的问题,通过从这里手动下载libjpeg tarball并运行以下命令解决了问题:

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
cp /usr/share/libtool/config.sub .
cp /usr/share/libtool/config.guess .
./configure --enable-shared --enable-static
make
sudo make install

sudo ranlib /usr/local/lib/libjpeg.a #Optionally

虽然编译版本现在应该是v8d,但对我来说解决了同样的问题,而我的系统上没有那些libtool文件(仍然可以工作)。 - Christoph Burschka
问题对我也解决了。谢谢! - Rolle

5
一个不太优雅的解决方案,但对我来说运作良好。
ln -s /usr/local/lib/libjpeg.9.dylib /usr/local/lib/libjpeg.8.dylib

软件有版本号是有原因的。如果它尝试调用不存在或签名已更改的库,它将导致您的服务器崩溃。 - miken32

5

以下命令对我有效。

brew switch libjpeg 8d

这对我有用。我使用 ls /usr/local/Cellar/jpeg/ 查看了我的目录,并看到了两个子目录 8d9c。由于我的错误是 dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.8.dylib,所以它试图加载错误的库是有道理的。 - TrophyGeek

4

我没有尝试Jirson的回答,但对我有用的是:

brew uninstall libjpeg
brew install libjpeg

你对所有依赖于libjpeg的软件包该怎么处理?错误:拒绝卸载 /usr/local/Cellar/jpeg/9b,因为它是 [SNIP] 所需的依赖项,这些软件包当前已安装。 - Richard A Quadling
1
@RichardAQuadling 当你卸载时,可以使用“--ignore-dependencies”选项。 - sepehr
这对我似乎没有解决问题。最新的jpeg版本目前是jpeg-9b。在遵循@gwg的指示后,libjpeg.8.dylib仍然丢失。 - Gino

3

我曾经遇到同样的问题,唯一有用的方法是使用 --build-from-source 参数:

brew install php70 --build-from-source

2
我也遇到了这个问题。我是通过以下方式解决的: 卸载jpeg/8b:
brew uninstall --ignore-dependencies libjpeg

卸载jpeg/9b:

brew uninstall --ignore-dependencies jpeg

卸载 jpeg/8b 和 9b

重新安装 jpeg/9b

brew install jpeg

Re-install jpeg/9b


工作了,耶!! - Husam

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