一点上下文。假设我有源文件,需要在静态库中结束。假设有两个 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
。看起来不错。
问题
我可以看到的问题是,如果我ar
单独运行命令foo/a.o
并将bar/a.o
它们放在同一个静态库中。现在后一个对象文件将覆盖前者,所以在运行时nm libfoobar.a
我只在库中看到后一个对象。我猜这是由于相同的目标文件名造成的。
使用 创建静态库时ar
,我应该始终将所有对象一次合并,还是一次运行ar
多次收集部分对象也可以,最终都在同一个静态库中?对于这个例子,我可以看到前者的作品,但不是后者。
当一个a.cpp
改变并且静态库需要改变时,事情将如何工作?会在图书馆ar
找改权吗?a.cpp
这只是一个小例子,但考虑一个包含许多文件并且一些具有相同名称的大型项目。如果您现在想创建一个库,您也可能会遇到这种情况。
一般来说,这只是库的组成方式、文件命名方式的糟糕组织,还是有其他东西可以让事情正常工作?