在 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,而 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 可一次仅设置一个编译作业。

相关内容