我使用GCC从源代码编译英特尔TBB。 它生成一个libtbb.so和littbb.so.2。 看起来.so.2文件是真正的共享库,libtbb.so只是包含一行文本INPUT (libtbb.so.2)
生成这两个文件而不是一个的目的是什么? 对于INPUT (libtbb.so.2) ,语法是什么? 我想了解更多。
加载boost的共享库时出错
用g ++dynamic共享库编译
在运行时加载Linux库
通常,当您构建共享对象(.so)时,您还可以通过添加后缀(如mylib.so.2.3.1)来处理版本。 为了确保你的程序可以加载这个lib或其他更新的版本,你可以使用名字创建链接
mylib.so -> mylib.so.2.3.1 mylib.so.2 -> mylib.so.2.3.1 mylib.so.2.3 -> mylib.so.2.3.1
因此,.so后面的所有内容代表version.sub-version.build(或类似)。另外,同一个lib的多个版本可能与此方案共存,并且只需将所有程序切换为使用特定版本是有适当的链接到位。
动态链接的ELF二进制文件(无论是另一个库还是一个可执行文件)使用共享对象名称或soname来标识在执行时可执行文件应链接的库。
当一个库被创建为一个ELF共享库时,编译时链接编辑器将一个DT_SONAME字段插入到该库的SONAME库中的可执行文件中。 DT_SONAME在ELF标准中被定义为:
这个元素包含一个以null结尾的字符串的字符串表偏移量,给出了共享对象的名字。 偏移量是记录在DT_STRTAB条目中的表的索引。 有关这些名称的更多信息,请参见下面的“共享对象依赖关系”。
所以现在当一个可执行文件被创建时,SONAME被嵌入到其中。 当运行可执行文件时,链接器使用该文件在动态库的预先指定位置的文件中查找库。 窗口中的预定义位置将位于DLL所在的位置。 在Linux和Mac OS X以及其他System V兼容系统中,它们将是/lib和/usr/lib以及可能的其他位置,这取决于所使用的链接器,并且可以在链接器自己的配置中定义。
在所有的事件中,链接器都会查看soname条目中是否存在任何位置的库,是否会使用它。
请注意,标准说soname是一个STRING,版本约定成为事实上的事实标准,如下所示:
使soname为libmyname.so.A ,并使库文件名为libmyname.so.AB或libmyname.so.ABC(在MacOSX下是libmyname.ABdylib)。 从libmyname.so.AB[.C]?创建一个软链接libmyname.so.AB[.C]? 到libmyname.so.A 。
A保持不变,而图书馆的ABI保持不变。
B (或BC )成为次要版本。
在Linux下,库的版本和软件包的版本号是一样的。 这有其优点和缺点。
libtool形式化
GNU libtool被用来构建动态库,并有一个更正式的版本控制系统,并具有强大的逻辑。 soname的libtool版本控制系统工作得很好,被复杂的图书馆采用,以保持直线。
在libtool下,版本控制如下:
libmylib- 当前 。 释放 。 年龄
在libtool下的想法是,随着图书馆的发展,他们将添加和删除功能。
假设你正在开发一个库。 首先使用版本0.0.0 。
因此,新的名称将来到libmylib.0.1.0或libmylib.0.2.0等。每个版本只修复错误,但不会更改任何ABI。
一路上你说。 啊! 我可以更好地完成这个子功能,所以你增加了一套新的功能来做更好的事情,但是因为其他人仍然在使用你的库,所以你仍然保留旧的(不赞成的)功能。
规则如下:
从每个libtool库的版本信息“0:0:0”开始。
仅在公开发行软件之前立即更新版本信息。 更频繁的更新是不必要的,只保证当前的接口号码变得更快。
如果自上次更新以来库源代码已经改变,则增量修订('c:r:a'变为'c:r + 1:a')。
如果自上次更新以来已添加,删除或更改了任何接口,则将当前值增加,并将修订版本设置为0。
如果自上次公开发布以来删除或更改了任何接口,则将age设置为0。
您可以在libtool文档中阅读更多关于它的信息
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。