INPUT (libtbb.so.2)
。为什么会生成这两个文件而不是一个?对于
INPUT (libtbb.so.2)
,它的语法是什么?我想了解更多关于这方面的内容。INPUT (libtbb.so.2)
。INPUT (libtbb.so.2)
,它的语法是什么?我想了解更多关于这方面的内容。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之后的所有内容代表版本.子版本.构建号(或类似形式)。 此外,使用该方案可以同时存在多个相同库的版本,将程序切换到使用特定版本所需的全部就是放置适当的链接。
file
命令。例如:file mylib.so
会告诉你它是ASCII文本还是ELF共享对象(如果是Linux)。 - kevinarpe现在,当可执行文件被创建时,其SONAME被嵌入其中。运行可执行文件时,链接器使用它来查找动态库在预定义位置的文件中。在Windows中,预定义位置将是DLL所在的任何位置。在Linux、Mac OS X和其他兼容System V的系统中,它们将是/lib和/usr/lib等位置,这取决于所使用的链接器,并可以在链接器自己的配置中定义。此元素保存空字符结尾的字符串的字符串表偏移量,给出共享对象的名称。 偏移量是记录在
DT_STRTAB
条目中的表中的索引。 有关这些名称的更多信息,请参见下面的“共享对象依赖性”。
B
(或B.C
)成为次要版本。
在Linux下,库版本通常与软件包版本号相同。这有其优缺点。
GNU libtool被广泛用于构建动态库,并具有更正式的版本控制系统和强大的逻辑。 sonames的libtool版本控制系统非常好,并被复杂库采用以保持事情清晰。
在libtool下,版本控制如下:
在libtool下,库的功能会随着时间的推移而增加和减少。libmylib-current.release.age
0.0.0
开始使用。
每个 libtool 库的版本信息从 ‘0:0:0’ 开始。
仅在软件公开发布前立即更新版本信息。更频繁地更新是不必要的,也只是保证当前接口号更快地增加。
如果自上次更新以来库的源代码发生了任何变化,则增加修订版号(‘c:r:a’ 变为 ‘c:r+1:a’)。
如果自上次更新以来添加、删除或更改了任何界面,请增加当前版本号,并将修订版号设置为 0。
如果自上次公开发布以来添加了任何接口,则增加年龄。
如果自上次公开发布以来删除或更改了任何接口,则将年龄设置为 0。
您可以在 libtool 文档 中了解更多信息
反驳:这里有一个错误:在Linux上,版本的形式为libmylib.(current-age).release.age,其中括号表示要评估的表达式。例如,带有当前版本:修订版:年龄= 37:1:1的GLPK 4.54在Linux上安装库文件libglpk.so.36.1.1。有关更多信息,请参见,例如,<autotools.io/libtool/version.html>。
始终增加修订值。
每当添加、移除或更改接口时,增加当前值。
仅在所做的ABI更改向后兼容时增加年龄值。
他接着说,在维护多个版本的Gtk时,最好将库版本附加到库名称中,然后简单地丢弃版本号。(就像在GTK+中所做的那样):这是一种毫无意义的炖锅方法来破坏动态链接和符号解析版本控制的强大功能!他的意思是只需关闭它。真是胡说八道!难怪即使经验丰富的开发人员也很难构建和维护开源项目,我们总是在每次安装库的新版本时遇到二进制文件死机(因为它们会相互覆盖)。In this situation, the best option is to append part of the library's version information to the library's name, which is exemplified by Glib's libglib-2.0.so.0 soname. To do so, the declaration in the Makefile.am has to be like this:
lib_LTLIBRARIES = libtest-1.0.la libtest_1_0_la_LDFLAGS = -version-info 0:0:0
libmylib.(current-age).release.age
,其中括号表示要评估的表达式。例如,在Linux上使用current:revision:age = 37:1:1
的GLPK 4.54安装库文件libglpk.so.36.1.1
。有关更多信息,请参见https://autotools.io/libtool/version.html。(一旦答案中纠正了这个问题,我会取消我的踩票。) - equaeghe36.1.1
和 libtool 版本 37:1:1
的问题。(注意 :
与 .
的区别。)这也是我提到 https://autotools.io/libtool/version.html 的原因,其中指出:“警告 一个常见的错误是假设传递给 -version-info
的三个值直接映射到库名称末尾的三个数字。[...] 对于 Linux,[...] 虽然最后两个值直接从命令行映射,但第一个值是通过从 current
中减去 age
计算得出的。[...]”。 - equaeghe