C ++ - g ++链接错误的stdlibc ++

时间:2016-12-22 12:09:29

标签: c++ gcc redhat ld

我有以下程序:

#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更高版本。

1 个答案:

答案 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本身。