具有相同名称(ar)的目标文件的静态库

有点背景。假设我有源文件,需要最终在静态库中。假设有两个cpp文件
a.cpp
a.cpp
位于两个不同的子目录中。像这样的东西:
foo/a.h
foo/a.cpp
bar/a.h
bar/a.cpp
他们的内容没有冲突,完全不同。文件名是一样的。 现在,在编译时,我最终得到两个
a.o
文件。
gcc -c foo/a.cpp -o foo/a.o
gcc -c bar/a.cpp -o bar/a.o
如果我现在创建一个静态库
ar rcs libfoobar.a foo/a.o bar/a.o
我可以看到运行
nm libfoobar.a
的静态库中的两个文件。看起来很好。 问题 我能看到的问题是,如果我单独为
foo/a.o
bar/a.o
运行
ar
命令,将它们放在同一个静态库中。现在后一个目标文件将覆盖前者,所以当运行
nm libfoobar.a
时,我只看到库中的后一个对象。我猜这是因为相同的目标文件名。 使用
ar
创建静态库时,我是否应该始终将所有对象组合在一起,还是可以多次运行
ar
一次收集一部分对象,最终都在同一个静态库中?在这个例子中,我可以看到前者的作品,但不能看到后者。 当一个
a.cpp
改变并且静态库需要改变时,它将如何工作?
ar
会找到正确的
a.cpp
来改变图书馆吗? 这只是一个小例子,但考虑一个包含许多文件的大型项目,其中一些具有相同的名称。如果您现在想要创建一个库,您也可能会遇到这种情况。 一般来说,这只是组织库的组织方式,文件的命名方式或是否有其它东西可以使事情有效?     
已邀请:
您必须将
ar
视为非常旧的文件存档。它甚至不知道有关归档目录的任何信息。 (档案是平的) (男子ar):
ar - create, modify, and extract from archives
man ar,选项
r
:   r将文件成员...插入存档(替换)。此操作与q的不同之处在于,如果其名称与添加的名称相匹配,则会删除任何以前存在的成员。 尝试运行
ar t libfoobar.a
并且您将只看到
a.o
文件,因为
ar
没有在存档中存储目录名称。 因此,如果要使用ar更新库中的某些目标文件,则必须以不同方式命名所有在ar存档中放置的目标文件(UPD)
ar rcs lib.a foo/a.o bar/a.o
替换了lib.a中找到的a.o,但它没有检查添加的文件是否存在名称冲突。 其他情况:
ar rcs lib.a foo/a.o
ar rcs lib.a  bar/a.o
将存档第一个a.o,然后第二个
ar
将在存档中找到旧的
a.o
并替换旧文件。     
库只是函数和/或数据的集合,恰好按库中的对象文件进行分组,并且这些对象文件具有名称。除了更新/提取/删除它们之外,这些名称不起任何作用。 因此,为两个或更多对象文件提供两个相同的名称是完全合法的。 更新库时,库管理程序用您正在替换的名称替换第一个对象,并且不再查看。 虽然做起来并不聪明。     
我只能解决你问题的一部分问题。从Makefile语法中我们看到它曾经是一种常规方式 - 只更新一个对象。但是,例如,即使一个文件被更改,automake的方法也是从头开始重建库。它现在不会造成大问题...... 对不起,现在手头没有unix,所以我们还是会等专家回答:) 根据我自己的经验,我不建议在静态库中使用两个具有相同名称的文件。     

要回复问题请先登录注册