c++ - C++ 中的即时对象初始化失败并出现 LNK2005 错误

标签 c++ linker-errors header-files

这些是我收到的错误:

LNK2005 "class Sally TestObject" (?TestObject@@3VSally@@A) already defined in Source.obj    Project2    c:\Users\W8User\documents\visual studio 2015\Projects\Project2\Project2\Source1.obj

LNK1169 one or more multiply defined symbols found  Project2    c:\users\w8user\documents\visual studio 2015\Projects\Project2\Debug\Project2.exe

我真的不明白这些错误是从哪里来的。我试过在其他 SO 线程或连接的 Microsoft 网站上搜索,但没有帮助。

这些是我的文件:

源.cpp

#include <iostream>
#include "Header.h"

int main() {

    std::cout << TestObject.ReturnTruth();

    return 0;
}

Header.h

#pragma once

class Sally
{
public:

    bool ReturnTruth();

} TestObject;

Source1.cpp

#include "Header.h"

bool Sally::ReturnTruth()
{
    return 1;
}

我所知道的是,将对象初始化移动到 Source.cpp 文件中而不是在头文件中立即执行就足够了,但既然即时初始化是可能的,那我为什么不使用它呢?

最佳答案

假设您有两个不同的 .cpp 文件,每个文件都包含您的 Header.h header 。然后,这些 .cpp 文件中的每一个都将这段代码合并到其中:

class Sally
{
public:

    bool ReturnTruth();

} TestObject;

因此,每个文件都包含一个名为 TestObject 且类型为 Sally 的对象的定义。这打破了单一定义规则,因为所有翻译单元中的每个对象最多只能有一个定义,这会在您的链接器错误中体现出来。

如果你确实想声明一个类型为 Sally 的全局对象,请更改 header 以声明一个类型为 Sallyextern 对象,例如这个:

class Sally
{
public:

    bool ReturnTruth();

};
extern Sally TestObject;

这是一个声明,而不是一个定义,可以有多余的对象声明。

然后,选择一个 .cpp 文件 - 可能是您实现 Sally 成员函数的文件 - 并添加以下行:

Sally TestObject;

这将对象的定义放在一个地方,从而解决了单一定义规则问题和链接器问题。

关于c++ - C++ 中的即时对象初始化失败并出现 LNK2005 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636389/

相关文章:

c# - Protocol Buffer ,让 C# 与 C++ 对话 : type issues and schema issues

c++ - 链接ibus(libibus),cmake中的glib

gcc - 帮助链接器失败 : . gnu.linkonce.t

C++ VS2010 未解析的符号

c - union、.c 和 .h 文件中的 Typedef 嵌套结构

c++ - 如果我希望stream_iterator不忽略空格该怎么办

ios - 与 SDWebImage 相关的架构 arm64 的重复符号

c++ - 库设计困惑.. "public"/"private"(template) headers, library files..?

c - 错误 : expected '=' , ',' , ';' , 'asm' 或 '__attribute__' 在 C 中的 '*' token 之前

c++ - 如何在C++中按字节写入文件