奇怪的链接错误

Strange Linking error

本文关键字:错误 链接      更新时间:2023-10-16

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

然后,我尝试将变量声明移动到仅包含此变量的新单独的 h/cpp 中,如下所示:

H 文件 (AAA.H)

#ifndef AAA_H
#define AAA_H
#include "classAdefinition.h"
extern ClassA VarA;
#endif

CPP 文件 (AAA.cpp)

#include "aaa.h"
ClassA VarA;

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

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

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

为了消除由于多个循环调用而发生的多个定义的错误,我建议您应该做的第一件事是编辑头文件以包含以下宏(无论情况如何)为每个文件指定一个唯一的名称

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

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

相关文章: