Centos 5.8 に PhantomJS 1.6 をインストールする

Centos 5.8 に PhantomJS 1.6 をインストールする

Centos 5.8 サーバーに PhantomJS v1.6 をインストールしようとしています。phantomjs を実行しようとすると、次のエラーが発生します。

phantomjs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by phantomjs)
phantomjs: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by phantomjs)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.7' not found (required by phantomjs)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.7' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtGui.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.11' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtGui.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtGui.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.10' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtNetwork.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libQtCore.so.4)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.11' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libfreetype.so.6)
phantomjs: /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libc.so.6: version `GLIBC_2.7' not found (required by /usr/phantomjs-1.6.0-linux-x86_64-dynamic/bin/../lib/libfontconfig.so.1)

調べてみると、これらはかなり低レベルのシステム ファイルなので、いじってはいけないのではないかと思います。これをサーバー上で実行する方法はありますか?

答え1

glibc と libstdc++ でバージョン管理されたシンボルを探しています。システム上のライブラリのバージョンは古いため一致しませんが、これは当然です。なぜなら CentOS は、新しいソフトウェアに関してはかなり保守的な RedHat AdvancedServer を追跡しているからです。

libstdc++ 内のシンボルは次のように確認できます。

nm -D /usr/lib64/libstdc++.so.6 | grep GLIBC

nm名前付きシンボルをダンプし、動的ライブラリの場合は -D を使用し、名前の場合は grep を使用します。

うーん、これらはかなりコアなライブラリです。libstdc++ は、OS 上で C++ を使用するすべてのアプリで使用されます。glibc は、ほとんどすべてのアプリで使用されます。おそらく、これらをその場で更新することは望ましくありません。また、たとえ更新したとしても、次のシステム更新で更新内容が失われる可能性があります。

Firefox でも同様の問題が発生しましたが、次の方法で対処できます。

  • Fedora RPM リポジトリを見つけます。このサイト 便利そうです。
  • バージョンを選択してください。どれがうまくいかなかったとしても、もう一度試します。
  • 選択したバージョンの libc および libstdc++ x86_64 RPM を見つけます。ダウンロードします。
  • tmp ディレクトリに移動して解凍します。rpm2cpio libstdc++WHATEVER.rpm | cpio -iv --make-directories
  • 別のディレクトリを作成します。このディレクトリはしばらくそのままにしておく必要があります。/usr/local またはホーム ディレクトリで場所を見つけます。名前を付けるには、おそらく $HOME/lib/lib64 にします。必要に応じて名前を置き換えます。mkdir $HOME/lib/lib64
  • libstdc++.so.6 ファイルを見つけて、$HOME/lib/lib64 にコピーします。

これで、必要なライブラリが $HOME/lib/lib64 (または配置した場所) に用意されました。次に、アプリを実行するときに、新しいライブラリの検索方法を指定する必要があります。

  • LD_LIBRARY_PATH=$HOME/lib/lib64:$LD_LIBRARY_PATH appThatNeedsNewLib arg1 arg2

これを複数回実行することに備えてください。これを行うと、適切な libstdc++ バージョンを取得すると、更新をダウンロードする必要のある他の古いファイルも公開されました。

答え2

適用対象: PhantomJS 1.6。Centos 5.6 でテスト済み

ソースからコンパイルすれば、問題なく動作します。

./build.sh

ビルド後にデプロイすると、任意の場所で実行できるようになります。エラーが発生しているファイルをコピーして置き換えるだけです。

私も同じ問題を抱えていました。ソースからコンパイルし、必要なファイルをコピーしました。(私がやったように、別のサーバーでコンパイルし、ファイルをコピーしたと仮定していますが、同じサーバーでも常に実行できます)

usr/local/src にダウンロードしてコンパイルしました。必要なファイルを元の場所にコピーしました。

cp -rP /usr/local/src/phantomjs-1.6.0-linux-x86_64-dynamic/bin/phantomjs* /data/phantomjs/bin/
cp -rP /usr/local/src/phantomjs-1.6.0-linux-x86_64-dynamic/lib/l* /data/phantomjs/lib/

警告: PhantomJS をソースからコンパイルするには、WebKit モジュールに何千ものファイルがあるため、長い時間がかかります。最新のマシンで 4 つの並列コンパイル ジョブを実行すると、全体のプロセスに約 30 分かかります。既製のバイナリ パッケージが利用可能な場合は、それをインストールすることを強くお勧めします。Linux

注 1: デフォルトでは、build.sh は 4 つの並列コンパイル ジョブを起動します。仮想マシン/サーバーまたはその他の制限された環境でビルドする場合は、数値を渡してジョブを減らします。たとえば、一度に 1 つのコンパイル ジョブのみを設定するには、./build.sh --jobs 1 と指定します。

関連情報