error LNK2005: “找到一个或多个多重定义的符号” 已经在 main.obj 中定义 的解决方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wanzew/article/details/81638128

这里我有三个源文件:Base.hpp, Base.cpp 和 main.cpp

在Base.hpp里面定义一个基类,注意,基类只包含构造函数和析构函数的声明,函数在Base.cpp里实现。

此外在Base.hpp中还有一个函数的定义(函数声明和定义都在Base.hpp文件中)三个文件代码如下:

// Base.hpp
#ifndef VIRTUAL_H
#define VIRTUAL_H

#include<iostream>
#include<string>

using namespace std;

class Base{
public:
	Base();

	~Base();

private:
	char *p;
};

void platform(Base *pBase){
	cout << "this is just a function..." << endl;
}

#endif
//Base.cpp
#include"Base.hpp"

Base::Base(){
	cout << "construction function..." << endl;
}

Base::~Base(){
	cout << "destructor function..." << endl;
	delete p;
}
//main.cpp
#include"Base.hpp"
#include<iostream>
using namespace std;

int main(){
	cout << "main..." << endl;

	Base * pBase = new Base;
	delete pBase;

	system("pause");
	return 0;
}

此时编译会出现一个问题:

1>Base.obj : error LNK2005: "void __cdecl platform(class Base *)" (?platform@@YAXPAVBase@@@Z) 已经在 main.obj 中定义
1>c:\users\wanzew\documents\visual studio 2013\Projects\Class\Debug\Class.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

经过分析,确定了这是由于两个实现文件(main.cpp 和 base.cpp)中重复包含了头文件而造成的。

要注意的是,在这里,在头文件中加入#ifndef……#endif这样的预编译命令是没用的,因为这是防止嵌套包含头文件的,而本例中并没有嵌套包含,是 在两个文件中分别包含。

  • 解决方法:

只在头文件中声明函数,把函数定义都放到cpp文件中,本例中把platform函数的定义从Base.hpp文件中移到Base.cpp文件中。

把函数体放到cpp文件中后确实可行:

同理:如果在头文件中再定义一个变量:int a = 10; 那么由于头文件在两个cpp文件中都有被包含,也会出现类似的错误。

  • 解决方法

把变量的定义放到Base.cpp文件中。

猜你喜欢

转载自blog.csdn.net/wanzew/article/details/81638128
今日推荐