首先,要知道我对c ++和Ubuntu非常陌生。
我有一个程序正在尝试使用Makefile使用GCC(我的版本是gcc 4.8.4)进行编译。 问题在于可执行文件是在它可以使用的目录下创建的,但是当将其复制到其他文件(甚至被迫在makefile上创建)时,它会说。
/usr/lib/i386-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found
也当我检查带有字符串/usr/lib/x86_64-linux-gnu/libstdc++.so.6的版本时| grep GLIBCXX,我得到:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH
据我一直在网上阅读的问题是,在我使用4.8.4时,gcc 4.9及更高版本仅支持GLIBCXX_3.4.20,但仍然不知道为什么它可以在特定目录,而不是其他目录。
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
由于我没有更新gcc的权限,因此我想知道该怎么办才能解决此问题... 在需要GLIBCXX_3.4.20的代码上应该避免使用哪些东西? 我是否可以强制编译器以某种方式使用该库的旧版本,或者将该特定库包含在二进制文件中? (我不明白如果没有所需的库,为什么它也可以在目录中工作)
先谢谢您,如果我的问题很愚蠢或没有道理,就像我说的那样,我很新。
答案 0 :(得分:0)
我一直在尝试注释和取消注释代码的所有部分,并且得到了答案,即string.find()函数给我带来了麻烦。
愤怒的活动不能代替理解。
从您描述的症状来看,很明显,您拥有libstdc++.so.6
的两个单独版本,并且程序在特定目录中运行时绑定到一个版本,而在该目录之外运行时绑定到另一个版本。
然后您的第一个任务是确定何时使用的libstdc++.so.6
版本。您可以执行以下操作:
cd /path/to/specific/directory
LD_DEBUG=files,libs /path/to/binary ...args...
并将输出与
进行比较cd /tmp
LD_DEBUG=files,libs /path/to/binary ...args...
一旦您知道运行libstdc++.so.6
的路径,就需要弄清楚为什么仅在某些时间而不是所有时间都在使用它。
常见原因包括在LD_LIBRARY_PATH
环境变量(错误),二进制文件本身的RPATH
或RUNPATH
中具有 relative 路径,或者它所依赖的库之一。
您可以通过以下方式检查RPATH
:
readelf -d /path/to/binary | egrep 'RPATH|RUNPATH'
您的最后一步应该是摆脱相对路径(无论它们来自何处-从来都不是一个好主意),并安排正确版本的libstdc++.so.6
(通常是通过在链接时提供-Wl,-rpath=/path/to/desired/directory
来获得 allways )。
完成此操作后,无论从哪个目录调用程序,程序都应正常运行。
答案 1 :(得分:0)
wget https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz
tar xvf gcc-10.2.0.tar.gz
cd gcc-10.2.0
mkdir -p /mnt/distvol/opt/gcc/10.2.0
./configure --with-system-zlib --disable-multilib --enable-languages=c,c++ --prefix=/mnt/distvol/opt/gcc/10.2.0
make -j 2
make install
ln -s /mnt/distvol/opt/gcc/10.2.0/bin/* /usr/bin/ -f
mv /usr/bin/lib64/libstdc++.so.6 /usr/bin/lib64/libstdc++.so.6.bak
strings $(find /mnt/distvol/opt/gcc/10.2.0/ -name "libstdc++.so.6") | grep GLIBCXX_3.4.
ln -s /mnt/distvol/opt/gcc/10.2.0/lib64/libstdc++.so.6 /usr/bin/lib64/libstdc++.so.6