我有以下程序:
#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++.so.6中选择了libstdc ++
设置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更高版本。
我认为这可能基本上与我的问题重复:Forcing or preventing use of a particular minor version of libstdc++
这个问题包括一种安装程序的方法,该程序使用更高版本的gcc编译,但可能是一个黑客。这个问题寻求一个更好的选择,虽然我认为我接近一个,但我还没有接受答案。
它没有在问题中明确提到,但我有更新版本的gcc安装到/ opt / 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本身。