
我正在嘗試在我的 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++ 可供在作業系統上使用 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(四)個並行編譯作業。在虛擬機器/伺服器或其他有限環境上建置時,透過傳遞一個數字來減少作業,例如 ./build.sh --jobs 1 一次僅設定一個編譯作業。