C++ 重复定义(Link 1169)的解决

错误提示:“fatal error LNK1169: 找到一个或多个多重定义的符号”。

一、场景再现:

1.在 "Test.h"头文件中定义一个类 Test,并实现 Test::Test(){} 和 Test::~Test() 方法;

2.在 "TestA.cpp" 文件中包含这个头文件;

3.在 "Error_Test.cpp" 文件中包含上述两个文件。

如下三段代码:

//文件名:"Test.h"
#pragma once

class Test
{
public:
	Test();
	~Test();

private:

};

Test::Test()
{
}

Test::~Test()
{
}
//文件名:"TestA.cpp"
#include "stdafx.h"
#include "Test.h"
//文件名:"Error_Test.cpp"
// Error_Test.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Test.h"
#include "TestA.cpp"

int main()
{
	return 0;
}
1>------ 已启动生成: 项目: Error_Test, 配置: Debug Win32 ------
1>TestA.obj : error LNK2005: "public: __thiscall Test::Test(void)" (??0Test@@QAE@XZ) 已经在 Error_Test.obj 中定义
1>TestA.obj : error LNK2005: "public: __thiscall Test::~Test(void)" (??1Test@@QAE@XZ) 已经在 Error_Test.obj 中定义
1>D:\myWorkspaces\Vs2017\Error_Test\Debug\Error_Test.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>已完成生成项目“Error_Test.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

运行后抛出 error,说是 连接失败,TestA.obj 中的 函数 "public: Test::Test(void)" 已在 Error_Tesst.obj 中定义过,故重复定义。

 

二、解决方法:

将 "Test.h" 中的全局函数 Test::Test(){} 和 Test::~Test() 实现放到另一个文件中 "Test.cpp",此时连接成功。

如下代码:

//文件名:"Test.h"
#pragma once

class Test
{
public:
	Test();
	~Test();

private:

};
//文件名:"Test.cpp"
#include "stdafx.h"
#include "Test.h"

Test::Test()
{
}

Test::~Test()
{
}
//文件名:"Error_Test.cpp"
// Error_Test.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Test.h"
#include "TestA.cpp"

int main()
{
	return 0;
}
1>------ 已启动生成: 项目: Error_Test, 配置: Debug Win32 ------
1>Error_Test.cpp
1>Test.cpp
1>TestA.cpp
1>正在生成代码...
1>Error_Test.vcxproj -> D:\myWorkspaces\Vs2017\Error_Test\Debug\Error_Test.exe
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

所以,类的实现代码还应放在 .cpp 中。

猜你喜欢

转载自blog.csdn.net/weixin_39469127/article/details/81101849