以下是造成此链接器错误的文件(仅显示文件, namespace 和类名称):
// PubSub.hpp:
#ifndef PubSub_hpp
#define PubSub_hpp
namespace PubSub {
class Publisher {}
}
}
#endif
// Client.hpp:
#ifndef Client_hpp
#define Client_hpp
#include "PubSub.hpp"
class Client {
}
#endif
// Scene.hpp:
#ifndef Scene_hpp
#define Scene_hpp
#include "Client.hpp"
class Scene {
}
#endif
在这种状态下,代码可以正确编译。但是,一旦我在 namespace 下的PubSub.hpp中将变量引入PubSub ,如下所示:
// PubSub.hpp:
#ifndef PubSub_hpp
#define PubSub_hpp
namespace PubSub {
class Publisher {}
}
Publisher NetworkEventPublisher("someName");
}
#endif
我在标题中看到链接器错误。我可以找到一种解决方法,但是我正在尝试学习C++,所以我在问什么是引起这种情况的规则?
最佳答案
如果在一个以上的翻译单元(.cpp文件)中包含PubSub.hpp,则将多次定义NetworkEventPublisher
,这就是链接器的抱怨所在。
解决方案是移动:
Publisher NetworkEventPublisher("someName");
到实现文件(即PubSub.cpp)。如果希望其他翻译单位看到它,则将其添加到PubSub.hpp extern声明中:
extern Publisher NetworkEventPublisher;
关于c++ - 试图了解C++:体系结构x86_64的重复符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36691759/