在我的lib目录中,我看到大多数共享对象链接都是级联的。例如:
libctest.so.1.0 -> libctest.so.1
libctest.so.1 -> libctest.so
我知道libctest.so
的链接是为了让编译标记-lctest
起作用,但是libctest.so.1
是什么意思?
答案 0 :(得分:1)
我认为你以相反的顺序编写了电影名称,通常如何显示,你会有3个文件
libctest.so.1.0 (library file)
libctest.so.1 -> libctest.so.1.0 (symlink to the libctest.so.1.0 file)
libctest.so -> libctest.so.1 (symlink to the libctest.so.1 symlink
这是一个版本控制方案。
库的特定版本/安装具有完整的文件名,例如嵌入到此库中的libctest.so.1.0
是SONAME,它是库的逻辑名称,例如libctest.so.1
,也用作实际文件的符号链接。
链接可执行文件时,库SONAME将添加到可执行文件中,因此在运行时,可执行文件将查找libctest.so.1
的文件名。惯例是让库的SONAME保持不变,只要它向后兼容,并在引入向后不兼容的ABI更改时更改它。
正如您所说,链接器将在您进行链接时查找lib*.so
。
这样,在libctest.so.1
升级时,链接到libctest
的可执行文件(或其他库)可以保持不变。因此,当libctest版本1.1发布时,您可能拥有以下文件:
libctest.so.1.1
libctest.so.1 -> libctest.so.1.1
libctest.so -> libctest.so.1
可执行文件仍然尝试定位libctest.so.1,因此在升级库时可以保持不变。必须编写库,以便向后兼容,以便在实践中工作。
如果你发布了一个新的向后不兼容的库,那么约定就是改变那个库的SONAME,所以你最终会得到例如。
libctest.so.2.0
libctest.so.2 -> libctest.so.2.0
如果不同的exeucatbles需要不同版本的库,这支持在系统上安装几个不兼容的库版本。
答案 1 :(得分:0)
这些数字都是关于版本控制的。这意味着您可以轻松地同时安装多个版本的库,并且与特定版本链接的应用程序将使用该版本(因为链接器会解析符号文件系统链接)。