奇怪的链接错误

时间:2012-06-11 16:10:57

标签: c++ visual-studio-2008 templates reference linker

我正在开发一个大型c ++项目,并改变其他人的代码。在此期间,我收到一个链接器错误,指出引用VarA是多重定义的。我找到了相应的变量,它已在cpp文件中定义,该文件已直接包含在项目中。我试图在头文件和源文件中转换源文件,但这不起作用。

然后我尝试将变量声明移动到仅包含此变量的新的单独h / cpp中,看起来像:

h-file(aaa.h)

#ifndef AAA_H
#define AAA_H

#include "classAdefinition.h"
extern ClassA VarA;

#endif

cpp-file(aaa.cpp)

#include "aaa.h"
ClassA VarA;

如果我现在在主文件中包含aaa.h,则链接器错误会将新创建的aaa.obj添加到错误消息中(例如VarA也在那里定义)这正是我的意思预期。但是当我删除主文件中VarA的定义时,我得到一个链接器错误,但是没有定义VarA,这实在令人困惑。

有没有人知道这种行为可能是什么原因?

我正在使用VS2008,项目是使用cmake创建的。这可能导致问题吗?例如。可能有配置问题?我们也经常使用模板,这会导致问题吗?

2 个答案:

答案 0 :(得分:0)

为了消除因多次循环调用而发生的多重定义错误,我建议您首先要做的是编辑头文件以包含以下宏(无论你的情况如何)给出每个文件都有一个唯一的名称

#ifndef CAR_HPP
#define CAR_HPP
class Car 
    {
    public:
    ....
    protected:
    ....
    };
#endif

答案 1 :(得分:0)

我没有发现错误,但现在避免了问题,因为大多数第三方代码已经更改,错误不再发生。