链接到C+中的错误库版本+;应用 我在RHEL/CCENTOS 5上对C++二进制文件进行故障排除,这与OpenSSL共享库有问题。我没有做太多的C/C++编程,我很难找到根本问题

链接到C+中的错误库版本+;应用 我在RHEL/CCENTOS 5上对C++二进制文件进行故障排除,这与OpenSSL共享库有问题。我没有做太多的C/C++编程,我很难找到根本问题,c++,linux,linker,qmake,rhel5,C++,Linux,Linker,Qmake,Rhel5,似乎出错的是,应用程序正在链接到libcrypto和libssl(0.9.8)的特定版本,而不是/lib/libcrypto.so.6和/lib/libssl.so.6的符号链接路径。由于openssl LIB在编译后已更新,因此现在已损坏 ldd显示二进制文件存在以下两个问题: libcrypto.so.0.9.8 => not found libssl.so.0.9.8 => not found [编辑]我获得了源代码,并且它构建正确。我将不得不用最简单的解释,构建机器被错误地

似乎出错的是,应用程序正在链接到libcrypto和libssl(0.9.8)的特定版本,而不是
/lib/libcrypto.so.6
/lib/libssl.so.6
的符号链接路径。由于openssl LIB在编译后已更新,因此现在已损坏

ldd
显示二进制文件存在以下两个问题:

libcrypto.so.0.9.8 => not found
libssl.so.0.9.8 => not found

[编辑]我获得了源代码,并且它构建正确。我将不得不用最简单的解释,构建机器被错误地配置为非标准库,并且makefile很好。

D'oh,我将这个问题误解为您自己构建的二进制文件的故障排除


您可以使用
ldd-your-binary
检查它将在运行时加载哪些库

如果它有意加载不同的版本,您应该检查
LD\u LIBRARY\u PATH
环境和
/etc/LD.so.config
中的加载程序配置,以获取加载库的路径列表。或者,可以使用链接行上的
-rpath
开关将加载程序路径硬编码到二进制文件中-在Makefile中查找这些开关。

一些建议(我假设您无法获得链接到新版本ssl LIB的新二进制文件):

  • 从以前版本的包中获取旧版本的libs,并将它们保留在二进制文件中(您可以将它们放在/usr/lib之外的某个位置,并仅为使用LD_LIBRARY_PATH的程序加载它们)

  • 使用LD_PRELOAD强制加载libs的新版本,并希望二进制所需的所有符号都在那里,并且二进制实际运行。这种方法很难奏效,但值得一试


  • 对不起,我应该在问题中添加ldd输出。我知道我可以加载旧库,我认为我可以通过预加载新库或添加适当的符号链接来强制加载新库,但我想找出问题的原因;这两个都是我自己的,这样我就可以知道哪里出了问题,这样我就可以向开发人员提供更多的信息。搜索它看起来像libcrypto.so.6是OpenSSL 0.9.8库的常用名称,所以我猜您的二进制文件是由使用不同发行版的人创建的,这些发行版的名称不同。在这种情况下,我会在这里使用2,甚至只是在libcrypto.so.0.9.8->libcrypto.so.6等的/lib中添加符号链接。我想您现有的库实际上可以工作。刚刚看到您的评论:我会问您的开发人员他们使用的是什么发行版,因为我希望它与此相关。@Rup-它应该是在同一个平台上构建的;)这是一个很好的观点,它可能是在一个openssl库名称不同的系统上。我试图自己重新构建它以进行测试,但这是一件烦琐的事情——等待QT立即编译。