具有相同名称的对象文件的静态库(ar)

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改变的权利吗?

这只是一个小例子,但考虑一个包含许多文件的大型项目,其中一些具有相同的名称.如果您现在想要创建一个库,您也可能会遇到这种情况.

一般来说,这只是组织库的组织方式,文件的命名方式或是否有其它东西可以使事情有效?

osg*_*sgx 7

您必须将其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 存储在存档中,然后第二个ara.o在存档中找到较旧的并替换旧文件。

  • @osgx:不确定这会如何改变事情。我觉得奇怪的是,如果我使用一个“ar”命令创建一个静态库,则可以在一个静态库中拥有相同的命名对象,而如果我执行两次,每个对象文件一个,则不能。肯定与对象文件的名称存在冲突。因此,我试图找出这里出了什么问题以及为什么它适用于一种情况。 (2认同)
  • 我并不是说做我所描述的事情是个好主意,我只是想知道当我运行 `ar rcs libfoobar.a foo/ao bar/ao` 时可能发生的事情,但是不是当我运行 `ar` 两次时,每个目标文件一个。我觉得这很奇怪。 (2认同)
  • 带有一个文件的“r”选项执行按名称查找和替换。如果您在一个命令中创建整个存档,则所有文件都将放入存档中,而无需比较您添加的所有文件的名称。在我们的大型 unix 项目中,如果任何成员发生更改,我们将使用完整的 `.a` 存档重新创建。 (2认同)
  • 如果库有多个相同的文件名,则库不会损坏(gcc 和 ld 会将它链接好)。问题是用`ar r`替换任何这样的文件 (2认同)