在我的程序中,我遇到了LNK1169,考虑到上下文,我不知道如何导致此错误。
单位.h:
#ifndef UNITS_H
#define UNITS_H
namespace units {
extern constexpr double N = 1.0;
};
#endif
答:
#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。
2条答案
按热度按时间oalqel3c1#
我认为这是因为当你编译
a.cpp
时,你会得到units::N,它被定义为include的一部分。然后当你编译
b.cpp
时,你也会得到units::N作为include的一部分,include保护只在预处理阶段起作用,但此时你已经编译了a.cpp和b.cpp,它们都包含units. h,因为你在两者中都 * 定义了 *(而不是声明了)N,这可能是链接器看到的错误。如果您想了解更多信息,并且看起来您使用的是VS,这里有一个指向
extern
文档的链接,其中特别提到extern constexpr
。https://learn.microsoft.com/en-us/cpp/cpp/extern-cpp?view=msvc-170cbwuti442#
问题是
extern constexpr double N = 1.0;
是一个名为N
的变量的定义,该变量具有***外部链接***,因为您使用了extern
关键字。因此,当此头文件包含在多个源文件中时,该变量将被定义多次,因此出现错误。要解决这个问题,要么删除
extern
关键字,这样N
将具有***内部链接***,要么如果你使用c++17,用inline
替换extern
。