我的任务是将一组封闭的源代码库从Windows / MSVC2013移植到带有gcc的Ubuntu Linux 12.04 / 64。我已经编译并安装了gcc5.2("官方" C ++ 11支持所需),它也用libstdc ++替换了libstdc ++库.so.6.0.21。
我的库使用 - 以及其他 - 伟大的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
答案 0 :(得分:2)
似乎问题是您将二进制文件与一个libstdc ++链接,而Linux的动态链接器使用另一个。这就是静态链接使你的程序工作的原因。
您可以通过在/etc/ld.so.conf.d/libc.conf中注释掉不必要的库副本并在后面运行ldconfig来修复它。