LNK1169 由在单独的 cpp 文件中多次包含标题引起

问题描述 投票:0回答:2

在我的程序中,我遇到了 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。

c++ compiler-errors include linker-errors
2个回答
0
投票

我认为这是因为当您编译

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


0
投票

问题

extern constexpr double N = 1.0;
是一个名为N的变量的
definition
external linkage因为你使用了
extern
关键字。因此,当此头文件被多个源文件包含时,该变量会被多次定义,因此会出现错误。

To solve这要么删除

extern
关键字,这样
N
将具有内部链接,或者如果您使用的是c++17,则将
extern
替换为
inline

© www.soinside.com 2019 - 2024. All rights reserved.