我有以下程序:
#include <iostream>
int main()
{
std::cerr << "hejsan" << std::endl;
}
使用以下命令进行编译:
g ++ main.cpp -Wl,-rpath,/ app / vbuild / RHEL6-x86_64 / gcc / 6.2.0 / lib -std = C ++ 11
运行ldd返回:
ldd a.out
linux-vdso.so.1 => (0x00007ffe8f1eb000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000032f9e00000)
libm.so.6 => /lib64/libm.so.6 (0x00000032f6600000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000032f8a00000)
libc.so.6 => /lib64/libc.so.6 (0x00000032f5a00000)
/lib64/ld-linux-x86-64.so.2 (0x00000032f5600000)
如您所见,它在/ usr / lib64 / libstdc ++中选择了libstdc ++。so.6
设置LD_DEBUG = libs显示以下内容:
792127: find library=libstdc++.so.6 [0]; searching
792127: search path=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls/x86_64:/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls:/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/x86_64:/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib (RPATH from file ./a.out)
792127: trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls/x86_64/libstdc++.so.6
792127: trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/tls/libstdc++.so.6
792127: trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/x86_64/libstdc++.so.6
792127: trying file=/app/vbuild/RHEL6-x86_64/gcc/6.2.0/lib/libstdc++.so.6
792127: search cache=/etc/ld.so.cache
792127: trying file=/usr/lib64/libstdc++.so.6
这是我想要它使用的stdlib:尝试file = / app / vbuild / RHEL6-x86_64 / gcc / 6.2.0 / lib / libstdc ++。so.6但不知怎的,它看起来像正在使用缓存。我没有root权限,也无法删除任何内容。我该如何解决这个问题?
这是问题所在,因为我使用它来处理更复杂的代码,这需要GLIBCXX比usr / lib64中提供的stdlib更高版本。
答案 0 :(得分:1)
我认为这可能与我的问题重复:Forcing or preventing use of a particular minor version of libstdc++
该问题包括安装使用更高版本的gcc编译的程序的方法,该程序可以工作但可能是黑客攻击。这个问题寻求一个更好的选择,但我还没有接受答案,尽管我认为我接近一个。
问题中没有明确提及,但我在/ opt / gcc /中安装了较新版本的gcc。我按照以下方式设置了使用它们的路径:
PREFIX=/opt/gcc6.3.0
export C_INCLUDE_PATH=$PREFIX/include
export CPLUS_INCLUDE_PATH=$PREFIX/include
export LD_LIBRARY_PATH=$PREFIX/lib:$PREFIX/lib64:$LD_LIBRARY_PATH
export PATH=$PREFIX/bin:$PATH
使用cmake进行配置时,使用它可能很有用:
CC=`which gcc` CXX=`which c++` cmake ...
确保cmake找不到系统gcc本身。