c++ - 对向 ec2 linux 添加新 glib 版本的所有帖子感到困惑

标签 c++ linux amazon-web-services amazon-ec2 glib

我知道这个问题已经被问过一千次了,因为我已经阅读了大部分答案,现在我完全迷失了。

在 EC2 AWS AMI 上

这是我构建新 glib 版本的代码

wget https://download.gnome.org/sources/glib/2.47/glib-2.47.4.tar.xz
tar -xJf glib-2.47.4.tar.xz
mkdir /home/_tmp/glib_build
cd /home/_tmp/glib_build
/home/_tmp/glib-2.47.4/configure --prefix=/home/NewBin
make -j ${MAXCORES}
sudo make install

一切似乎都很好,因为很多文件最终都在 /home/NewBin 中,并且日志中没有错误。

然后我尝试使用以下代码从源代码构建 HHVM,

export LD_LIBRARY_PATH=/home/NewBin/lib:$LD_LIBRARY_PATH
sudo ldconfig 
cmake -DENABLE_ZEND_COMPAT=ON .
make -j ${MAXCORES}

返回如下错误

cmake -DENABLE_ZEND_COMPAT=ON .
cmake: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by cmake)
cmake: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by cmake)
+ make -j 40
make: relocation error: /home/_bin/lib/libc.so.6: symbol _dl_find_dso_for_object, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

如果我在没有 LD_LIBRARY_PATH 的情况下运行代码

sudo ldconfig 
cmake -DENABLE_ZEND_COMPAT=ON .
make -j ${MAXCORES}

出现以下错误

cmake: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by cmake)
cmake: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by cmake)
+ make -j 40
make: *** No targets specified and no makefile found.  Stop.

如何将 make 指向新的 glib 版本?

最佳答案

您似乎有 3 个不同的问题,实际上与 GLIB 没有任何关系。

最严重的问题是你不明白你在做什么,“狂热不能代替理解”。

这个错误:

make: relocation error: /home/_bin/lib/libc.so.6: symbol _dl_find_dso_for_object, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

是因为您在/home/bin/lib 中安装了libc.so.6 的私有(private)拷贝。作为这个answer解释说,如果你想使用非默认/非系统 libc.so.6,你需要做更多的事情。特别是,将 libc.so.6 放在 LD_LIBRARY_PATH 上的任何位置是一个非常糟糕的主意(TM)

最后一个问题是这个:

cmake: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found ...

此错误告诉您的是,您正在调用的 cmake 版本是使用 later g++ 版本构建的你已经安装了一个。具体来说,GLIBCXX_4.3.21 was introduced在 gcc-5.1 中(你的 cmake 是用它构建的,或者是 g++ 的更高版本),但是系统 libstdc++.so.6 来了来自早期版本的 GCC。

那么,解决方案是什么?

最简单的方法是将整个系统更新到一个足够新的发行版,其中所有二进制文件都是根据一致的系统库集构建的。

如果您做不到,那么您需要更深入地了解您正在做的事情,并更加熟悉配置和构建您需要的各种二进制文件和库。特别是,您应该永远不要设置LD_LIBRARY_PATH,而是添加适当的--rpath=... 设置只是对于需要非系统库版本才能运行的二进制文件。

关于c++ - 对向 ec2 linux 添加新 glib 版本的所有帖子感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34699916/

相关文章:

c++ - opencv 二进制数据 jpg 图像到 cv::Mat

amazon-web-services - 使用单个容器配置将端口映射添加到Dockerrun.aws.json

amazon-web-services - 我正在运行一个 REST API 服务器,但我不太了解基础架构。另外,我可以做些什么来进行基准测试和提高速度?

amazon-web-services - 使用 PostMan 上传多部分 Amazon S3 Rest API 时出现问题

c++ - 单例类的私有(private)析构函数

c++ - 在可变参数模板类的构造函数中初始化元组成员

c++ - 为什么 VS2012 无法识别 C++ 项目中的某些 C++11 关键字?

linux - 未找到 yocto defconfig

opengl - 如何将库添加到 CMakeLists?

linux - 使用 TaskSet 运行 Shell 脚本