使用eclipse编写C++程序可以成功编译,但是在执行时找不到动态库。使用“ldd”显示xxx.12 => not found。
那么为什么要对依赖库进行.so重命名?

最佳答案

我找到答案:
-Wl选项告诉编译器将后续参数传递给链接器。
-soname指定动态库的soname(共享对象名称的缩写)。
-Wl表示以下参数是-soname,libhello.so.1直接传递到连接器ld进行处理。实际上,每个库都有一个soname。当连接器在要查找的库中找到名称时,连接器会将soname嵌入链接中的二进制文件中,而不是其正在运行的实际文件名中。在程序执行过程中,程序将查找名称为soname而不是库文件名的文件。换句话说,soname是库的区别标志。
这样做的主要目的是允许多个版本的库文件在系统中共存。命名库文件时,习惯上使用与soname相同的名称。
Libxxxx.so.major.minor
其中xxxx是库的名称,major是主要版本号,minor是次要版本号。
简而言之,soname指定库的名称,而不管生成的库的名称如何。在进行连接时,将soso指定的名称添加到可执行文件中,然后运行程序以加载soname指定的库。文件名。因此,如果程序连接到新升级的库,则只需要将新库复制到目录,然后使用所谓的soname进行调用。
如果库已升级,但是程序仍使用旧的链接库,则只需将旧的库名称链接到新升级的库。
soname的关键功能是它提供了兼容性标准:
当您要在系统中升级库时,新库的名称与旧库的名称相同,由旧库链接生成的程序仍可在新库中正常使用。此功能使在Linux下轻松升级共享库程序和位置错误。

在Linux中,应用程序通过使用soname指定所需库的版本。库作者可以通过保留或更改soname来声明兼容的版本,从而使程序员摆脱共享库版本冲突。
您可以使用readelf -d查看每个动态库的SONAME
————————————————
版权声明:本文是CSDN博客“寻找大海中的小鱼”的原创文章,遵循CC 4.0 BY-SA版权协议(protocol),请转载原始源链接和此声明。
原始链接:https://blog.csdn.net/wang_hufeng/article/details/53899120

09-16 10:07