gpt4 book ai didi

c++ - 静态库中的多个定义

转载 作者:行者123 更新时间:2023-12-01 19:26:23 24 4
gpt4 key购买 nike

我有一个与 Linker does not emit multiple definition error when same symbol coexists in object file and static library 密切相关的问题,但涉及的情况略有不同。就像那里一样,我有两个 .cpp 文件(例如: test1.cpptest2.cpp ),每个文件都包含相同函数的实现,即 void testfunc() 。我还有一个头文件test.h我在其中声明testfunc ,以及文件 main.cpp其 main 函数包含对 testfunc() 的调用像这样:

include "test.h"
int main() {
testfunc();
}

我通过调用 g++ -c *.cpp 单独编译 .cpp 文件然后使用 ar rvs libtest.a test1.o test2.o 创建一个静态库。链接时main.o现在针对库,链接器不会像我预期的那样提示:

gcc main.o -L. -ltest -o main

生成的可执行文件工作得很好 - 调用 testfunc() 的两个实现之一。老实说,我预计会出现类似 multiple definition of... 的错误发生。因此,我的问题是:

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

最佳答案

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

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

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

关于c++ - 静态库中的多个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com