1

我在一个类的头文件中包含一个带有全局提升信号的 .h 文件,该头文件又包含在主函数的文件中。链接器说信号被多次声明。信号声明包含在 C/C++ 头文件中典型的#ifndef,#define#endif块中(用于避免多重声明)。我正在使用带有 gcc 的 Eclipse。

#ifndef SIG_HEADER
#define SIG_HEADER
#include <boost/signal.hpp>

boost::signal0 <void> signal1;

#endif

我究竟做错了什么?

4

2 回答 2

5

您收到的是链接器错误,而不是编译器错误。因此,预处理器指令在这里对您没有帮助。

您需要做的是在源文件(而不是头文件)中定义变量,并在extern头文件中使用声明。

于 2012-07-08T20:59:14.030 回答
3

您的链接器是正确的。每次包含此标头时,都会定义符号 signal1,从而导致多重定义错误。

拯救你的是extern关键字,它将告诉编译器这是一个将被整个程序访问并需要外部链接的对象。然后,您必须在其他地方为编译器提供变量的定义,例如在此标头的 cpp 文件中。

这个问题提供了有关外部链接的更多信息。

于 2012-07-08T21:16:51.927 回答