error:LNK2005 函数已经在*.obj中定义

出现上面的错误,只要原因有如下几个:

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文件中。

  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 这是一个链接错误,表示函数 "main" 已经在文件 "1hello world.obj" 定义过了。在 C++ 程序,每个程序都必须有一个名为 "main" 的函数,它是程序的入口点。如果在同一个程序多次定义了 "main" 函数,就会产生这个错误。 解决办法是: - 检查程序是否有多个文件定义了 "main" 函数,如果有,请将其一个删除。 - 检查程序是否有多次定义了 "main" 函数,如果有,请将多余的定义删除。 - 如果您是使用第三方库或组件时遇到这个错误,请检查是否存在重复的定义,并请联系库或组件的提供商寻求帮助。 ### 回答2: 这个错误是由于在同一个程序定义了多个名为"main"的函数导致的。 在C++,每个程序只能有一个入口函数"main"。当在同一个项目有多个源文件时,如果每个源文件都定义了一个名为"main"的函数,编译器就会报告LNK2005错误。 解决这个错误的方法是确保每个项目只有一个名为"main"的函数。可以检查项目是否存在多余的源文件或文件是否定义了多个"main"函数。如果有,可以删除多余的源文件或将额外的"main"函数重命名为其他名称。 另外,有时候这个错误可能是由于错误的链接选项导致的。可以检查项目配置的链接选项,确保没有重复的源文件被包含在链接过程。 总之,要解决LNK2005错误,需要确保每个项目只有一个名为"main"的函数,并且检查配置选项以确保正确的链接。 ### 回答3: 这个错误是由于在程序存在重复定义了main函数所导致的。 在一个C/C++程序,每个源文件只能有一个main函数,作为程序的入口点。当在多个源文件同时定义了main函数时,编译器在链接时就会报错,提示main函数已经在某个obj文件定义过了。 解决这个错误的方法有两种: 1. 删除重复的main函数定义:查找并删除多余的main函数定义,只保留一个即可。通常情况下,只需要在程序的一个源文件定义main函数即可。 2. 将重复定义的main函数改为其他名称:如果确实需要在多个源文件定义一个入口函数,可以将其一个main函数改名为其他不重复的函数名,然后修改调用该函数的地方。 总之,在解决这个错误时,需要确保整个程序只有一个main函数定义,避免在多个源文件重复定义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值