我正在尝试在我的 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,而 RedHat AdvancedServer 在新软件方面相当保守。
您可以通过这种方式检查 libstdc++ 中的符号:
nm -D /usr/lib64/libstdc++.so.6 | grep GLIBC
nm
转储命名符号,-D 表示动态库,grep 表示你的名字
嗯,这些都是非常核心的库。任何在操作系统上使用 C++ 的应用程序都会使用 libstdc++。几乎所有东西都会使用 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 可一次仅设置一个编译作业。