我在头文件中定义了一个函数。在调试中,它可以很好地编译和链接。在发行版中,对于包含标头的每个类的每个目标文件,我都会收到编译错误“`blah::blah(blah& blah)' 的多重定义”。
我正在使用 gcc-4.8.1。我无法发布实际代码,这个版本已更改名称以保护无辜者:
#ifndef INCLUDE_SMELLS_FUNNY
#define INCLUDE_SMELLS_FUNNY
#include "ParentClass.h"
#include "ChildClassA.h"
#include "ChildClassB.h"
namespace someplace {
bool smellsFunny(const ParentClass& someData) {
// All ChildClass As smell funny
if(dynamic_cast<const ChildClassA*>(&someData)) {
return true;
}
// If ChildClass B, need to check if smells funny
const ChildClassB* childB = dynamic_cast<const ChildClassB*>(&someData)
if(childB) {
return childB->MoreThanAWeekOld();
}
// Default is smells OK
return false;
}
}
#endif // INCLUDE_SMELLS_FUNNY
我一直无法找到哪个 gcc 标志负责。当然,修复只是将实现移动到 cpp 文件中。但为什么这是必要的?为什么这只会在发布时发生?