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

时间:2015-11-18 15:21:42

标签: c++ linux ubuntu gcc libstdc++

我的任务是将一组封闭的源代码库从Windows / MSVC2013移植到带有gcc的Ubuntu Linux 12.04 / 64。我已经编译并安装了gcc5.2("官方" C ++ 11支持所需),它也用libstdc ++替换了libstdc ++库.so.6.0.21。

我的库使用 - 以及其他 - 伟大的log4cplus日志框架。这是我想要移植的第一部分,我已经成功了:

  • 构建log4cplus共享库
  • 将log4cplus共享库部署到/ usr / local / lib并运行sudo ldconfig
  • 构建依赖于log4cplus的静态库(基本上将一些语法糖放在log4cplus周围)
  • 构建测试应用程序并将其链接到静态库

当我使用g ++的-static-libstdc ++编译器选项来编译log4cplus时,我的测试应用程序启动并正常工作。但是,这不是最终解决方案(闭源)。当我省略log4cplus makefile中的选项时,运行我的应用程序时出现以下错误:

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位可执行文件,所以我希望它链接到该库:

$ 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

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

echo $LD_LIBRARY_PATH 

只是没有给我任何东西,所以除了标准之外没有其他途径应该适用

除了我无法解释的错误之外,令我困惑的是没有(链接到)libstdc ++。所以位于/ usr / lib或/ usr / local / lib中,但是,似乎找到了库(当找不到库时,我看到了不同的错误。)

如果我提出愚蠢的问题/犯了愚蠢的错误,我道歉,但我是Linux新手,这次调查是我在过去几天里开始闯入该领域令人沮丧的结果。

任何帮助将不胜感激!

编辑 - Oleksandr Kravchuk提出的问题

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

# libc default configuration
/usr/local/lib

1 个答案:

答案 0 :(得分:2)

似乎问题是您将二进制文件与一个libstdc ++链接,而Linux的动态链接器使用另一个。这就是静态链接使你的程序工作的原因。

您可以通过在/etc/ld.so.conf.d/libc.conf中注释掉不必要的库副本并在后面运行ldconfig来修复它。