libstdc++.so.6 重定位错误

Relocation error with libstdc++.so.6

我的任务是使用 gcc 将一组闭源库从 Windows/MSVC2013 移植到 Ubuntu Linux 12.04/64。我已经编译并安装了 gcc5.2(需要 "official" C++11 支持),它还将 libstdc++ 库替换为 libstdc++.so.6.0.21。

我的图书馆使用 - 其中 - 伟大的 log4cplus 日志记录框架。这是我要移植的第一部分,我已经成功了:

当我使用 g++ 的 -static-libstdc++ 编译器选项编译 log4cplus 时,我的测试应用程序启动并运行良好。然而,这不是最终的解决方案(闭源)。当我省略 log4cplus makefile 中的选项时,我收到以下错误 运行ning 我的应用程序:

BasicsTests: relocation error: /usr/local/lib/liblog4cplusU.so.0: symbol _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference 

我已经使用 readelf 工具查明这个符号是否真的丢失/版本错误,但显然情况并非如此:

$ readelf -s --wide /usr/local/lib64/libstdc++.so.6 | grep _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev
  4858: 000000000010cd10   108 FUNC    WEAK   DEFAULT   11 _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21
  6042: 000000000010cd10   108 FUNC    WEAK   DEFAULT   11 _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev

我的测试应用程序是一个 64 位可执行文件,所以我希望它 link 到那个库:

$ file BasicsTests 
BasicsTests: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped

我不确定重定位针对的是哪个特定的 so 库(我的系统上有其他 libstdc++ 版本,但是 none 其中的版本早于 6.0.19,而且它们位于我的目录中怀疑是特定于应用程序的)。

echo $LD_LIBRARY_PATH 

什么也没给我,所以除了标准之外,没有其他路径可以应用

除了我无法解释的错误之外,令我困惑的是没有(link to)libstdc++.so位于/usr/lib或/usr/local/lib,但是,该库似乎已找到(当找不到该库时,我会看到不同的错误)。

如果我问了愚蠢的问题/犯了愚蠢的错误,我深表歉意,但我是 Linux 下的开发新手,这项调查是我最近几天开始进入该领域的令人沮丧的结果。

任何帮助将不胜感激!

编辑 - Oleksandr Kravchuk 的问题

/etc/ld.so.conf.d/libc.conf 内容:

# libc default configuration
/usr/local/lib

看来问题是你 link 你的二进制文件有一个 libstdc++ 而 Linux 的动态 linker 使用另一个。这就是静态 linking 使您的程序运行的原因。

您可以通过在 /etc/ld.so.conf.d/libc.conf 和 运行 ldconfig afterwords.[=10= 中注释掉不必要的库副本来修复它]