静态库中的多重定义

Der*_*der 6 c++ linker unix-ar

我有一个与Linker 在目标文件和静态库中共存相同符号时不会发出多个定义错误的问题非常密切相关,但涉及的情况略有不同。就像那里一样,我有两个 .cpp 文件(比如:test1.cpptest2.cpp),每个文件都包含相同功能的实现,即void testfunc(). 我还有一个头文件test.h,我在其中声明testfunc,以及一个main.cpp带有 main 函数的文件,其中包含这样的调用testfunc()

include "test.h"
int main() {
    testfunc();
}
Run Code Online (Sandbox Code Playgroud)

我通过调用分别编译 .cpp 文件g++ -c *.cpp,然后使用ar rvs libtest.a test1.o test2.o. 当链接main.o对库现在,链接器不会抱怨,因为我希望它做的事:

gcc main.o -L. -ltest -o main
Run Code Online (Sandbox Code Playgroud)

生成的可执行文件工作得非常好 - 调用testfunc(). 老实说,我预计multiple definition of...会发生一些错误。因此,我的问题是:

  1. 为什么这实际上有效 - 是 中的原因ar,它只将两个目标文件中的一个添加到库中,或者库是否包含两个目标文件,这种行为的原因是在链接过程中找到的,其中链接器在找到testfunc? 的一个定义后停止搜索库。
  2. 我能以某种方式影响testfunc实际使用的定义还是这个定义?即,它可能是ar决定使用哪个参数的顺序?
  3. 对于任何链接器/版本,这种行为是否相同,ar或者这可能取决于系统?

eng*_*010 5

库只是包含导出符号的目标文件的集合。它可能包含任意数量的重复项(就像真实的图书库可能包含许多具有相同标题的书籍一样)。不涉及任何链接。

一般来说,链接时,链接器仅查看库,以防存在未解析的符号。当寻找这些符号时,它可能会找到一个,如果找到,它将不再寻找该符号。

当它解析在另一个包含先前找到的符号的定义的目标文件中找到的另一个未解析的符号时,可能会出现冲突;现在它会产生重复符号的错误。