这些是我收到的错误:
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 以声明一个类型为 Sally
的 extern
对象,例如这个:
class Sally
{
public:
bool ReturnTruth();
};
extern Sally TestObject;
这是一个声明,而不是一个定义,可以有多余的对象声明。
然后,选择一个 .cpp 文件 - 可能是您实现 Sally
成员函数的文件 - 并添加以下行:
Sally TestObject;
这将对象的定义放在一个地方,从而解决了单一定义规则问题和链接器问题。
关于c++ - C++ 中的即时对象初始化失败并出现 LNK2005 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636389/