出现上面的错误,只要原因有如下几个:
1.头文件的重复包含
包含的头文件中含有变量、函数、类的定义,在其他使用的地方多次包含,造成重复包含,产生LNK2005错误,
有两种解决方法:
1)使用宏 在头文件head.h中加入
#ifndef HEAD_H_ //这个地方写法有不少
#define HEAD_H_
......
#endif
2)使用预编译,文件开头加入
#pragma once
2. 使用第三方库造成
主要情形是C运行期函数库和MFC的库冲突造成的。具体的方法就是将提示出错的库放到另一个库的前面。
举例:
#include <WinSock2.h>
//WinSock2.h头文件必须在Windows.h之前
#include <Windows.h>
3.
1、重复定义全局变量
全局变量是针对整个工程的,在一个CPP文件的定义:int nCount;那么在使用的CPP文件中就应该使用extern int nCount即可,如果还是使用int nCount 就会产生LNK2005错误;
根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:
1)使用extern 关键字 2)不能给变量赋初值
如果还是报错的话,只在头文件中声明函数,把函数定义都放到cpp文件中。这里面转自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文件中。