
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 と指定します。