在我的程序中,我遇到了 LNK1169,考虑到上下文,我不明白这个错误是如何引起的。
单位.h:
#ifndef UNITS_H
#define UNITS_H
namespace units {
extern constexpr double N = 1.0;
};
#endif
A.h:
#pragma once
class A {
public:
A();
};
A.cpp:
#include "A.h"
#include "units.h"
A::A() {
}
B.h:
#pragma once
class B {
public:
B();
};
B.cpp:
#include "B.h"
#include "units.h"
B::B() {
}
ErrorTest.cpp:
#include "A.h"
#include "B.h"
int main()
{
A* _a = new A();
B* _b = new B();
return 0;
}
错误信息:
Error LNK1169 one or more multiply defined symbols found ErrorTest C:\Users\---\source\repos\ErrorTest\x64\Debug\ErrorTest.exe 1
Error LNK2005 "double const units::N" (?N@units@@3NB) already defined in A.obj ErrorTest C:\Users\---\source\repos\ErrorTest\ErrorTest\B.obj 1
有什么东西很明显是我想念的吗?我确定我遵守一个定义规则。
我试着确保我遵循一个定义规则并改变我包含 units.h 的方式,但错误总是一样的。如果我在多个 cpp 中包含 units.h,我将始终得到 LNK1169。
我认为这是因为当您编译
a.cpp
时,您将 units::N 定义为包含的一部分。
然后当你编译
b.cpp
时,你也会得到 units::N 定义为 include 的一部分。 include guard 仅适用于预处理阶段,但此时您已经编译了 a.cpp 和 b.cpp,它们都包含 units.h。由于您在两者中都defined(而不是声明)N,因此链接器可能将其视为错误。
如果您想阅读更多内容,并且因为看起来您正在使用 VS,这里有一个指向
extern
文档的链接,那里特别提到了extern constexpr
。 https://learn.microsoft.com/en-us/cpp/cpp/extern-cpp?view=msvc-170
问题是
extern constexpr double N = 1.0;
是一个名为N
的变量的definition和external linkage因为你使用了
extern
关键字。因此,当此头文件被多个源文件包含时,该变量会被多次定义,因此会出现错误。
To solve这要么删除
extern
关键字,这样N
将具有内部链接,或者如果您使用的是c++17,则将extern
替换为inline
。