2014-04-09 48 views
1

我需要使用C++ 11,因此我将GCC从4.1更新为4.7。我编译源代码并进行安装。 gcc -version将显示4.7.0(一切看起来不错)。我使用编译了一个程序:安装gcc 4.7但无法成功运行程序

g++ -O2 -std=c++11 -o wdSer wdSer.cpp 

后,我跑我的程序./wdSer,还有一些信息如下:

./wdSer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./wdSer) 
./wdSer: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by ./wdSer) 
./wdSer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.10' not found (required by ./wdSer) 
./wdSer: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./wdSer) 

谁能告诉我该怎么解决呢?

+0

你是在哪里安装的?您是否覆盖了系统提供的库版本,或者是否已将其安装在'/ usr/local'或其他位置?如果你重写了系统版本,那么你是一个比我更勇敢的人。如果你把它安装在其他位置,你可能必须确保新的库优先于系统库,可能在链接时使用'-R'选项或其等价物,可能使用'ld.so.conf '或者它的等价物(实际上哪个平台是你的),可能是'LD_LIBRARY_PATH'或者它的等价物。我很好奇,为什么4.7.0而不是4.8.2? –

+0

@JonathanLeffler我安装在/home/gcc4.7,我没有覆盖系统提供的。所以你的意思是我需要添加一些类路径? – dodolong

+0

@JonathanLeffler编译4.8.2源代码时有一些错误,但是4。7是OK。 – dodolong

回答

3

第一次尝试这样的:

LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH ./wdSer 

在/ usr /本地/ lib64的是海湾合作委员会的64位版本所默认的库目录。 设置LD_LIBRARY_PATH以包含该目录会告诉链接程序在该目录中查找库文件。

如果不行,看看G ++ -v

输出在我的系统,我得到这个:

$ g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/local/gcc-4.8.2/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper 
Target: x86_64-unknown-linux-gnu 
Configured with: ../gcc-4.8.2/configure --prefix=/usr/local/gcc-4.8.2 --with-isl=/usr/local/isl-0.12.2 --with-cloog=/usr/local/cloog-0.18.1 
Thread model: posix 
gcc version 4.8.2 (GCC) 

在此输出,你正在寻找下一个目录 - 字首。将/ lib64添加到该前缀的末尾,并且您将拥有您的库目录。 在我的系统上,它是/usr/local/gcc-4.8.2,所以我需要链接器在/usr/local/gcc-4.8.2/lib64中查找我的libstdC++。 于是我运行的程序是这样的:

LD_LIBRARY_PATH=/usr/local/gcc-4.8.2/lib64:$LD_LIBRARY_PATH ./a.out 

如果你不希望在运行您的程序前将LD_LIBRARY_PATH,你应该-Wl,-rpath =打造他们,就像这样:

$ g++ -std=c++11 -o wdSer -Wl,-rpath=/usr/local/lib64/ wdSer.cc 

您可以使用LDD上的程序,看看那里的共享库它与发现:

$ ldd a.out 
     linux-vdso.so.1 => (0x00007fff8a506000) 
     libstdc++.so.6 => /usr/local/gcc-4.8.2/lib64/libstdc++.so.6 (0x00007fa3c6aaf000) 
     libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa3c6811000) 
     libgcc_s.so.1 => /usr/local/gcc-4.8.2/lib64/libgcc_s.so.1 (0x00007fa3c67fa000) 
     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa3c646f000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fa3c6bbc000) 

这里,a.out的是一个程序,我用选项内置-Wl,-rpath =/USR /local/gcc-4.8 .2/lib64,因此链接器首先在那里查找,并找到与我的gcc 4.8.2安装一起使用的libstdC++。

请参阅-v标志的机制的文档:http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Overall-Options.html#Overall-Options(和搜索-v)

的-Wl标志:http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Link-Options.html#Link-Options(并向下滚动至底部)

和-rpath标志: https://sourceware.org/binutils/docs-2.24/ld/Options.html#Options(并搜索-rpath)

+0

+1:我看到你也经历过这些东西。 –