【发布时间】:2011-06-21 21:12:05
【问题描述】:
一点上下文。假设我有源文件,需要在静态库中结束。假设有两个 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 进行更改吗?
这只是一个小例子,但考虑一个包含许多文件并且一些具有相同名称的大型项目。如果您现在想创建一个库,您也可能会遇到这种情况。
总的来说,这只是库的组成方式、文件命名方式的糟糕组织,还是有其他东西可以使事情正常进行?
【问题讨论】:
-
我认为文件组织不佳..不确定..等待专家 cmets :)
标签: c++ linker static-libraries unix-ar