mur*_*att 9 c++ linker static-libraries unix-ar
有点背景.假设我有源文件,需要最终在静态库中.假设有两个cpp文件a.cpp,a.cpp位于两个不同的子目录中.像这样的东西:
foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp
Run Code Online (Sandbox Code Playgroud)
他们的内容没有冲突,完全不同.文件名是一样的.
现在,在编译时我a.o当然最终得到了两个文件.
gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o
Run Code Online (Sandbox Code Playgroud)
如果我现在创建一个静态库
ar rcs libfoobar.a foo/a.o bar/a.o
Run Code Online (Sandbox Code Playgroud)
我可以看到静态库中的两个文件都在运行nm libfoobar.a.看起来很好.
问题
我可以看到的问题是,如果我运行ar单个命令foo/a.o,并bar/a.o把它们放在同一个静态库.现在后一个对象文件将覆盖前者,所以在运行时nm libfoobar.a我只看到库中的后一个对象.我猜这是因为相同的目标文件名.
在创建静态库的时候ar,我是否应该总是将所有对象组合在一起,或者也可以ar多次运行,一次收集一部分对象,所有这些都在同一个静态库中?在这个例子中,我可以看到前者的作品,但不能看到后者.
当一个人a.cpp改变并且静态库需要改变时,它将如何工作?会在图书馆ar找到a.cpp改变的权利吗?
这只是一个小例子,但考虑一个包含许多文件的大型项目,其中一些具有相同的名称.如果您现在想要创建一个库,您也可能会遇到这种情况.
一般来说,这只是组织库的组织方式,文件的命名方式或是否有其它东西可以使事情有效?
您必须将其ar视为非常古老的文件归档程序。它甚至对归档目录一无所知。(ar档案是平的)
(男人): ar - create, modify, and extract from archives
男人,选项r:
r 将文件成员...插入存档(带替换)。此操作与 q 的不同之处在于,如果任何先前存在的成员的名称与添加的名称匹配,则会删除它们。
尝试运行 aar t libfoobar.a并且您将只看到a.o文件,因为ar没有在存档中存储目录名称。
因此,如果您想使用 ar 更新库中的某些目标文件,则必须以不同的方式命名放入 ar 存档中的所有目标文件 (UPD)
这ar rcs lib.a foo/a.o bar/a.o会替换 lib.a 中的 ao,但不会检查添加的文件是否存在名称冲突。
其他情况:ar rcs lib.a foo/a.o并将ar rcs lib.a bar/a.o第一个 ao 存储在存档中,然后第二个ar将a.o在存档中找到较旧的并替换旧文件。