错误提示:“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 中。