简单的问题,.A
中libobjc.A.dylib
的内容是什么?对于这个简单的问题感到抱歉,但Google的信息并不容易。#34; A"没有谷歌认为你将它作为单数" a"就像在#34;一只猫。"
答案 0 :(得分:2)
它是用于表示库版本的名称的一部分,并允许存在同一库的多个版本。通常有一个简单的名称链接到当前版本,就像libobjc
的情况一样:
$ ls -l libobjc.*
-rwxr-xr-x 1 root wheel 12937200 9 Jul 2016 libobjc.A.dylib
lrwxr-xr-x 1 root wheel 15 7 Nov 2015 libobjc.dylib -> libobjc.A.dylib
这表明libobjc.dylib
是libobjc.A.dylib
的符号链接。
作为另一个例子,请考虑libgcc
:
lrwxr-xr-x 1 root wheel 17 7 Nov 2015 libgcc_s.1.dylib -> libSystem.B.dylib
lrwxr-xr-x 1 root wheel 19 20 Dec 2016 libgcc_s.10.4.dylib -> libgcc_s.10.5.dylib
-rwxr-xr-x 1 root wheel 29480 2 Aug 2015 libgcc_s.10.5.dylib
这里有三个名称和两个不同版本的库。
需要特定库版本的软件可以与版本化名称链接。当更高版本与早期版本完全兼容时使用链接,因此与早期版本链接的软件实际上是后者版本。
所有这些只是动态链接的问题。使用静态链接,编译期间使用的库的实际版本将合并到软件二进制文件中,因此不依赖于系统上当前安装的库版本。
答案 1 :(得分:1)
我认为这只是一个命名惯例,用于区分动态库与其符号链接以及位于.A.dylib
内的任何/usr/lib
具有libsystem.B.dylib
依赖性的事实
将ls
与grep一起使用会显示.A.dylib
中的所有/usr/lib
个文件:
$ ls -lat | grep A.dylib
-rwxr-xr-x 1 root wheel 6076144 Jul 14 23:41 libicucore.A.dylib
-rwxr-xr-x 1 root wheel 14249664 Jul 14 23:41 libobjc.A.dylib
-rwxr-xr-x 1 root wheel 85136 Jul 14 21:29 libBSDPClient.A.dylib
-rwxr-xr-x 1 root wheel 32416 Jul 14 21:28 libDHCPServer.A.dylib
-r-xr-xr-x 1 root wheel 116352 Jul 14 21:27 libalias.A.dylib
-rwxr-xr-x 1 root wheel 497312 Jul 14 21:27 libpcap.A.dylib
-rwxr-xr-x 1 root wheel 530800 Mar 22 16:56 libtidy.A.dylib
-r-xr-xr-x 1 root wheel 84704 Mar 22 16:55 libipsec.A.dylib
lrwxr-xr-x 1 root wheel 21 Oct 1 2016 libBSDPClient.dylib -> libBSDPClient.A.dylib
lrwxr-xr-x 1 root wheel 21 Oct 1 2016 libDHCPServer.dylib -> libDHCPServer.A.dylib
lrwxr-xr-x 1 root wheel 16 Oct 1 2016 libalias.dylib -> libalias.A.dylib
lrwxr-xr-x 1 root wheel 18 Oct 1 2016 libicucore.dylib -> libicucore.A.dylib
lrwxr-xr-x 1 root wheel 16 Oct 1 2016 libipsec.dylib -> libipsec.A.dylib
lrwxr-xr-x 1 root wheel 15 Oct 1 2016 libmx.A.dylib -> libSystem.dylib
lrwxr-xr-x 1 root wheel 15 Oct 1 2016 libobjc.dylib -> libobjc.A.dylib
lrwxr-xr-x 1 root wheel 15 Oct 1 2016 libpcap.dylib -> libpcap.A.dylib
lrwxr-xr-x 1 root wheel 15 Oct 1 2016 libtidy.dylib -> libtidy.A.dylib
现在为.B.dylib
:
$ ls -lat | grep B.dylib
-rwxr-xr-x 1 root wheel 60848 Jul 14 21:28 libSystem.B.dylib
lrwxr-xr-x 1 root wheel 17 Oct 1 2016 libSystem.dylib -> libSystem.B.dylib
lrwxr-xr-x 1 root wheel 17 Oct 1 2016 libgcc_s.1.dylib -> libSystem.B.dylib
选择任何.A.dylib
并检查它的依赖关系:
$ otool -L libobjc.A.dylib
libobjc.A.dylib:
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 307.3.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
$ otool -L libipsec.A.dylib
libipsec.A.dylib:
/usr/lib/libipsec.A.dylib (compatibility version 1.0.0, current version 300.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
$ otool -L libicucore.A.dylib
libicucore.A.dylib:
/usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 57.1.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
...
是动态库还是静态库? file
告诉我们,它一直是一个动态库:
$ file libobjc.A.dylib
libobjc.A.dylib: Mach-O universal binary with 3 architectures: [x86_64: Mach-O 64-bit dynamically linked shared library x86_64] [i386] [x86_64h]
libobjc.A.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
libobjc.A.dylib (for architecture i386): Mach-O dynamically linked shared library i386
libobjc.A.dylib (for architecture x86_64h): Mach-O 64-bit dynamically linked shared library x86_64h
这里的逻辑似乎指向一种识别动态库(A
)的方法,这些库都具有依赖库(B
)的共同特征。
答案 2 :(得分:-2)
.A
个文件是静态库。您可以在on the Wikipedia找到更多相关信息。
它们是在编译的链接阶段链接到程序中的目标文件的集合,在运行时不相关