1. ホーム
  2. ruby

[解決済み] MacユーザーでWARNING: NokogiriはLibXMLバージョン2.7.8に対してビルドされましたが、2.7.3が動的にロードされています。

2023-06-04 06:48:41

質問

いろいろと調べ、いろいろなことを試してきました。この質問が何度も回答されていることは承知していますが、提案された解決策はどれも私には効果がありません。

Lion にアップグレードした後、私は Ruby でセグメンテーションフォールトを得ました。私は、それが Nokogiri であることを確信しています。そこで、Homebrew 経由で libxml2 をインストールしました。私は以下を実行しました。 brew link libxml2 . そして、そのバージョンのライブラリを使ってNokogiriを再インストールしました。

証明のために

$ nokogiri -v
# Nokogiri (1.5.0)
---
warnings: []
nokogiri: 1.5.0
ruby:
  version: 1.9.2
  platform: x86_64-darwin11.0.0
  description: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
  engine: ruby
libxml:
  binding: extension
  compiled: 2.7.8
  loaded: 2.7.8

Nokogiriはgemfileの先頭にも入れてありますし、環境ファイルにも必要です。なぜまだその警告が出るのか全くわかりません。

正しいバージョンの libxml2 をロードしていることを確認するために、何か提案やアイデアはありますか?

どのように解決するのですか?

私は午前中の大半を費やして、この警告を解決しました。 この修正は Mac OS Lion を使用している人のためのものです。 上記の修正では

bundle config build.nokogiri --with-xml2-include=/opt/local/include/libxml2 --with-xml2-lib=/opt/local/lib --with-xslt-dir=/opt/local

は、MacPorts 経由で libxml2 がインストールされた Snow Leopard 用です。

Lion では、libxml2 はブートストラッププロセスの一部としてロードされます。 Nokogiri がどの libxml2 を指しているかに関係なく、Lion のシステムデフォルトの libxml2 のライブラリが実行時に使用されます。 Lion では、以下の場所にある libxml2.2.7.3 を使用します。 /usr (ただし /usr/local ).

他の多くの場所で述べたように、警告を無視することができます。 私のように、警告で気が狂いそうになるなら、こうすればいいのです。

bundle config build.nokogiri --with-xml2-dir=/usr --with-xslt-dir=/opt/local --with-iconv-dir=/opt/local

興味深いことに、もしあなたが nokogiri -v と入力すると、逆の警告が表示されます。

WARNING: Nokogiri was built against LibXML version 2.7.3, but has dynamically loaded 2.7.8

このことから、RubyとRailsはシステムにロードされたlibxml2を使い、コマンドラインは環境パスからlibxml2を使うというように、libxml2のロード方法にはもっと別のものがあることがわかります。 とにかく、これでエラーはなくなりました。

もう一度言いますが、これは Lion 専用です。 以前の修正は Snow Leopard でも機能します。

これで回答は終わりです。 ここで読むのをやめてください。


OK、あなたは読むのをやめませんでしたね...さて...

お勧めしません!!!!!!!

あなたは警告されています。 Mac OSX がブートストラップで libxml2 ライブラリを読み込んでいるかどうかは /usr/lib . の全バージョンをコピーするようなことをしてください。 libxml2*.dyliblibxml2*.dylib.old (私のマシンでは、これは libxml2.2.7.3 , libxml2.2libxml2 ).

この後、Nokogiriを実行しても、エラーは発生しません。 これは、ロードされたlibxml2が見つからないため、環境のパスをたどり、最終的に libxml2.2.7.8/opt/local .

しかし、古い libxml ファイルをコピーして戻すことはできません。 これは、OS がブートストラップでロードされた libxml2 を必要とするためです。

電源を切り、再び電源を入れると、マシンがレンガ状態になります。 ログイン画面はハングアップし、ハングアップし、ハングアップします。 シングルユーザーモードで電源を切り、再度電源を入れる (ホールド コマンド - S を再起動しながら)。 ブートストラップが発生する様子を見ることができます。 驚くなかれ、libxml2 をロードできないというエラーを投げて、動作を停止しています。

電源を切り、もう一度電源を入れます。 今度はリカバリー モードで起動します (または コマンド - R またはホールド オプション を押して、リカバリディスクを選択します)。 リカバリーモードでターミナルを開く( utilities/terminal ). マウント /usr/lib をHDにマウントしてください(試しに /Volumes/Macintosh\ HD/usr/lib を試してみてください)、libxml2 ファイルをコピーして戻してください。 再起動すれば、すべてうまくいきます。