几个月前我在我的系统上构建并安装了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)
答案 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和手册,了解如何告诉链接器如何查找库。