具有相同名称(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
来改变图书馆吗?
这只是一个小例子,但考虑一个包含许多文件的大型项目,其中一些具有相同的名称。如果您现在想要创建一个库,您也可能会遇到这种情况。
一般来说,这只是组织库的组织方式,文件的命名方式或是否有其它东西可以使事情有效?
没有找到相关结果
已邀请:
3 个回复
倾坞髓
视为非常旧的文件存档。它甚至不知道有关归档目录的任何信息。 (档案是平的) (男子ar):
man ar,选项
: r将文件成员...插入存档(替换)。此操作与q的不同之处在于,如果其名称与添加的名称相匹配,则会删除任何以前存在的成员。 尝试运行
并且您将只看到
文件,因为
没有在存档中存储目录名称。 因此,如果要使用ar更新库中的某些目标文件,则必须以不同方式命名所有在ar存档中放置的目标文件(UPD)
替换了lib.a中找到的a.o,但它没有检查添加的文件是否存在名称冲突。 其他情况:
和
将存档第一个a.o,然后第二个
将在存档中找到旧的
并替换旧文件。
寒健
马口