C++为什么级联共享对象链接
问题描述:
在我的lib目录中,我看到大多数共享对象链接是级联的。例如:C++为什么级联共享对象链接
libctest.so.1.0 -> libctest.so.1
libctest.so.1 -> libctest.so
我知道libctest.so
链接是使编译标志-lctest
工作,但什么是有libctest.so.1
的地步?
答
我觉得你写的filnames以相反的顺序来它是如何正常显示,你将有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
这是一个版本控制方案。
库的特定发布/安装具有完整的文件名,例如,嵌入在该库中的是SONAME,该库的逻辑名称,例如, libctest.so.1
也用作实际文件的符号链接。
链接可执行文件时,库SONAME被添加到可执行文件,因此在运行时,可执行文件会查找文件名libctest.so.1
。约定是只要向后兼容,库的SONAME保持不变,并且在引入向后不兼容的ABI更改时更改它。
正如您所说,链接器将在您执行链接时查找lib*.so
。
当libctest
升级时,链接到libctest.so.1
的这种方式的可执行文件(或其他库)可以保持不变。因此,当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需要不同版本库库的几个不兼容的版本。
答
这些数字都是关于版本控制的。这意味着您可以轻松地同时安装多个版本的库,并且与特定版本链接的应用程序将使用该版本(因为链接器解析了符号文件系统链接)。
如果实际'so'文件的名称是'libctest.so.199',我只需要创建一个链接'libctest.so - > libctest.so.199',对不对? – user4016367