首先,我对 C++ 和 Ubuntu 非常陌生。
我有一个程序,我尝试使用 GCC(我的版本是 gcc 4.8.4)通过 makefile 进行编译。 问题是可执行文件是在它可以工作的目录下创建的,但是当它复制到任何其他目录(甚至强制在 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 时,GLIBCXX_3.4.20 仅受 gcc 4.9 及更高版本支持,但我仍然不明白为什么它可以在特定目录而不是其他目录。
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
由于我没有更新 gcc 的权限,我想知道我能做些什么来解决这个问题... 我应该避免在需要 GLIBCXX_3.4.20 的代码上使用哪些内容? 我可以强制编译器以某种方式使用该库的旧版本或在二进制文件中包含该特定库吗? (如果我没有所需的库,我无法理解为什么它可以在目录中工作)
提前致谢,如果我的问题很愚蠢或没有意义,我很抱歉,正如我所说,我对这一切都很陌生。
最佳答案
I have been trying commenting and uncommenting all parts of the code and I've got to the answer that the function string.find() is the one giving me that trouble.
激烈的事件并不能代替理解。
从您描述的症状来看,很明显您有两个不同版本的 libstdc++.so.6
,并且您的程序在特定目录中运行时绑定(bind)到一个版本,在该目录之外运行时绑定(bind)到另一个版本。
您的首要任务是找出 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
二进制文件本身或其依赖的库之一。
您可以检查RPATH
这样:
readelf -d /path/to/binary | egrep 'RPATH|RUNPATH'
您的最后一步应该是摆脱相对路径(无论它们来自何处 - 它们永远都不是一个好主意),并安排 libstdc++.so.6
的正确版本。 总是被拾取(通常通过在链接时提供 -Wl,-rpath=/path/to/desired/directory
)。
完成此操作后,无论从哪个目录调用您的程序都应该正常工作。
关于c++ - libstdc++.so.6 : version GLIBCXX_3. 4.20 未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53592796/