如何安装我刚刚构建的libstdc ++作为gcc的一部分?

时间:2014-05-04 00:10:33

标签: c++ linux gcc libstdc++

几个月前我在我的系统上构建并安装了gcc 4.8.2。今天我用它来编译一个使用C ++ 11线程库的程序,当我运行它时,它抱怨说无法找到正确版本的libstdc ++。所以我回到gcc 4.8.2源代码树并手动将libstdc++-6.0.18复制到适当的位置。之后,该计划正常运作。

让我感到困惑的是,当我安装gcc时,它并没有自动安装。有没有办法安装它而不手动复制文件?

编辑以回应评论: 错误讯息:

./a.out: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./a.out)

g++ -v的输出:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ./configure --program-suffix=-4.8.2
Thread model: posix
gcc version 4.8.2 (GCC) 

2 个答案:

答案 0 :(得分:0)

问题似乎是runpath / rpath。基本上,在链接期间使用两条路径,因为链接发生在两个阶段(通常)。第一阶段是在构建可执行文件期间,并且更像是“预链接”。通常在安装gcc时设置库路径,您可以看到-v作为​​链接器的-L选项(通常是collect2)。在运行时,实际链接已完成。该设置的路径不同,并且不是由安装设置的。

设置该版本的最佳方式可能是ldconfig,请参阅here。您可以在编译时设置LD_RUN_PATH环境变量。要查看将在运行时使用的库,请使用ldd命令。

ADDENDUM:就我个人而言,我将未使用软件包管理器管理的所有内容安装到一个单独的目录中。然后,我使用类似stow的内容来创建来自/usr/local/bin等的符号链接。否则,事情会散布在/usr/local的任何地方,只会造成混乱。

答案 1 :(得分:0)

  

今天我用它来编译一个使用C ++ 11线程库的程序,当我运行它时,它抱怨说无法找到正确版本的libstdc ++。

请参阅http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths及其链接的手册部分。

  

所以我回到gcc 4.8.2源代码树并手动将libstdc ++ - 6.0.18复制到适当的位置。之后,该计划正常运作。

我认为“适当的位置”是指/usr/lib下的某个地方。不,这绝对不是你应该做的。如果您稍后升级系统并且发行版的软件包管理器尝试安装GCC 4.8.2,那将导致问题,因为它会与您手动放置的文件发生冲突。

  

让我感到困惑的是,当我安装gcc时,它并没有自动安装。有没有办法安装它而不手动复制文件?

已将其安装到您配置要安装到的GCC的位置。因为在配置GCC时没有使用--prefix,所以它将安装到/usr/local并将库放在那里的某处。您/usr/local/bin中可能有$PATH,因此可以找到新的g++,但运行时链接程序不知道在/usr/local中查找共享库。

再次阅读http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths和手册,了解如何告诉链接器如何查找库。