内联定义的“错误 LNK2005:已在 .obj 中定义”

"error LNK2005: already defined in .obj" for inline definition

提问人:H.v.M. 提问时间:10/19/2023 最后编辑:H.v.M. 更新时间:10/19/2023 访问量:97

问:

我使用的是 Microsoft Visual Studio Professional 2017 版本 15.6.6。我创建了一个 Visual C++ 空项目并添加了以下内容:

Foo.h:

#pragma once
struct Foo
{
    static Foo F1;
};
inline Foo Foo::F1;

条形.cpp:

#include "Foo.h"

Baz.cpp:(来自 https://stackoverflow.com/a/65078857/1715765)

#include <sdkDdkVer.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#pragma runtime_checks("", off)
#pragma comment(linker, "/nodefaultlib /subsystem:windows /ENTRY:test")
int __stdcall test(void) { ExitProcess(0); }

#include "Foo.h"

编译时我得到以下内容。如果我删除一个,它会编译得很好#include "Foo.h"

Baz.obj : error LNK2005: "public: static struct Foo Foo::F1" (?F1@Foo@@2U1@A) already defined in Bar.obj

为什么它不起作用?

C 可视化 C++ 链接器内

评论

1赞 Pete Becker 10/19/2023
我敢打赌,您可以删除几乎所有这些代码,并且仍然显示问题。如果它不影响任何事情,请不要让人们涉足所有 Windows 内容。
0赞 H.v.M. 10/19/2023
@PeteBecker 需要有一个切入点。
0赞 Pete Becker 10/19/2023
@H.v.M. -- 你确定这只有在你有那么多 Windows 垃圾时才会发生吗?这似乎不太可能。尝试一个简单的项目,这是一个普通的 C++ 应用程序。您将覆盖更广泛的受众。
0赞 H.v.M. 10/19/2023
@PeteBecker我不知道如何使示例变小。如果我删除除 之外的所有内容,它不会编译,因为需要有一个入口点。#include "Foo.h"
0赞 Pete Becker 10/19/2023
@H.v.M. -- 好的,你在某处有一些设置,表明你正在构建一个 Windows 应用程序。当然,如果你不知道在哪里可以找到你无法修复它。但是Microsoft的东西能够构建普通的应用程序,而你不需要所有这些噪音。

答:

0赞 user17732522 10/19/2023 #1

对我来说,看起来像是编译器错误或不合规。

如果我忽略示例中所有特定于 Windows/MSVC 的内容,那么这是一个有效的标准 C++ 程序(除了缺少)。main