什么是`libobjc.A.dylib`中的`.A`

时间:2017-07-23 19:09:45

标签: objective-c c

简单的问题,.Alibobjc.A.dylib的内容是什么?对于这个简单的问题感到抱歉,但Google的信息并不容易。#34; A"没有谷歌认为你将它作为单数" a"就像在#34;一只猫。"

3 个答案:

答案 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.dyliblibobjc.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找到更多相关信息。

它们是在编译的链接阶段链接到程序中的目标文件的集合,在运行时不相关