为什么 g++ 会生成多个(弱)相似符号?

lee*_*roy 4 c++ linker gcc

我正在查看nm -C的输出

0804a86a W ForkMessageHandler::ForkMessageHandler()
0804a86a W ForkMessageHandler::ForkMessageHandler()
0804a6fa T ForkMessageHandler::~ForkMessageHandler()
0804a698 T ForkMessageHandler::~ForkMessageHandler()
0804a698 T ForkMessageHandler::~ForkMessageHandler()
0804a800 W MultiMessageHandler::MultiMessageHandler()
0804a800 W MultiMessageHandler::MultiMessageHandler()
0804a84c W MultiMessageHandler::~MultiMessageHandler()
0804a81c W MultiMessageHandler::~MultiMessageHandler()
0804a81c W MultiMessageHandler::~MultiMessageHandler()
Run Code Online (Sandbox Code Playgroud)

为什么 g++ 会生成很多类似的符号,弱符号的目的是什么?

编辑:这是来自最终的可执行文件,而不是 .o 文件。ForkMessageHandler 定义在一个 .cpp 文件中,没有人包含它的头 - 但有几个包含其基类的头。

Las*_*lan 5

这些是默认构造函数和自动生成的析构函数。它们将在包含类定义的每个编译单元中生成为弱符号,以保证至少有一个可用。

它们弱的原因是为了避免链接过程中的冲突,因为类定义将出现在每个目标文件中,包括它定义的头文件。