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

标签 c++ gcc linker

我正在查看 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()

为什么g++会生成很多相似的符号,弱符号的作用是什么?

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

最佳答案

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

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

关于c++ - 为什么 g++ 会生成多个(弱)相似符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211128/

相关文章:

c++ - 最简单的 Gtk::Builder get_widget() 程序出错

c - 是什么原因导致 "left but not entered"GCC 编译器错误?

c++ - 无法在 OS X 上包含 opencv3

windows - 在 Windows 上安装 Rust

c++ - 忽略具有单个全局变量的 cpp 文件

c++ - 我们可以在链接期间加载动态库吗?

c++ - 如何在C++中使用isspace函数?

c++ - NaN 上的飞船运算符(operator)

C++ .obj 解析器面

c - 在编译时将多个文件中的变量收集到一个连续的内存块中