精华内容
下载资源
问答
  • error LNK2005 已经在 obj 中定义 错误

    千次阅读 2015-03-11 12:53:33
    >> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义   通常是由于.h文件里定义了此变量,移动到.cpp文件里即可。 并使用到这个变量的cpp文件加上extern int ID;   ...

    >> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义

     

    通常是由于在.h文件里定义了此变量,移动到.cpp文件里即可。


    并在使用到这个变量的cpp文件中加上extern int ID;

     

    出错原因:

    无意中遇到了这样的编译问题, 于是google,发现在.h文件里定义变量,发生这问题的概率是灰常大的.

     

    下面这段红字是参考网上的说法:

     

    当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.

     

    不过经过一轮研究发现.. 其实这说法不怎么正确.. 最起码对VS来说..

    经过实验, 发现只要有两个cpp同时包含一个定义了变量的.h文件,就会提示错误.

     

    再回想下刚 考完的编译原理, obj是什么?  其实就是cpp翻译后的一坨中间代码.. 一般编译过程就是把cpp先翻译成obj, 最后把obj再连接成exe. 这样,不管中间有没有第三者把前两个连接一起, 最终obj还是会汇集在一起.. 下面可以看到,错误发生在链接,而不是翻译..

     

    正在链接...
    1>3.obj : error LNK2005: "int i" () 已经在 2.obj 中定义
    1>D:\编程之美\vs2008代码\dfsdfadsfec\Debug\dfsdfadsfec.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

     

     

    本人得出的结论:

    只要两个或者以上的.cpp同时包含了一个定义了变量的.h文件,就会提示错误.

    不过注意, 这中间可能会包含些比较复杂的逻辑关系.. 

    例如我的那坨代码.. 

    假定一个定义了变量的1.h文件

    有1.cpp和2.cpp, 1.cpp包含1.h,   2.cpp只包含2.h  但是2.h包含了1.h..  所以1.h中定义的变量编译的时候会在2.pp中有定义. 于是乎2.cpp翻译成的obj里也会有定义, 结果导致提示obj里重定义.

    在头文件和cpp文件错中复杂的情况下, 根本就很难判断其祸根源.

    所以得出结论:

    没事就别在.h中定义变量,或者初始化静态成员变量(我就是后一种情况).

    不过有种比较酷的做法, 就是直接改成.c编译.  据说c里遇到重定义,  会忽略为声明.

    展开全文
  • “error LNK2005: 已经在*.obj中定义”  编程经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原因,就可以轻松解决它了。造成LNK2005错误主要有以下几种情况:...

    为什么会出现这个错误??“error LNK2005: 已经在*.obj中定义” 
      编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原因,就可以轻松解决它了。  

    造成LNK2005错误主要有以下几种情况:  


    1.重复定义全局变量。可能存在两种情况:  
     A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。

      正确的应该是在一个CPP文件中定义如下:

    int   g_Test;

      那么在使用的CPP文件中就应该使用:  

    extern   int   g_Test

      即可,如果还是使用int   g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:  

    *.obj   error   LNK2005   int   book   c?   already   defined   in   *.obj

      切记的就是不能给变量赋值否则还是会有LNK2005错误。  

      这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:  
      (1)声明必须使用extern关键字

      (2)不能给变量赋初值  

      所以,下面的是声明:      

    extern   int   a;  


      下面的是定义 :

        int   a;  
        int   a   =   0;  
        extern   int   a   =0;  

      B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。  

    2.头文件的包含重复。

      往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。解决办法是在需要包含的头文件中做类似的处理:

      #ifndef   MY_H_FILE       //如果没有定义这个宏  
      #define   MY_H_FILE       //定义这个宏  
      …….       //头文件主体内容  
      …….  
      #endif  

      上面是使用宏来做的,也可以使用预编译来做,在头文件中加入:  

      #pragma   once  
      //头文件主体  

      3.使用第三方的库造成的。

      这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。微软和C有两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。如果不得不使用第三方的库,可以尝试按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的:  
        A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore   libraries   的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library   Modules的Edit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God   bless   you!  
        B、选择VC菜单Project->Settings->Link页,然后在Project   Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。  
        C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code   Generation后再在User   Runtime   libraray中选择MultiThread   DLL等其他库,逐一尝试。

    展开全文
  • error:LNK2005 函数已经在*.obj中定义

    万次阅读 2019-08-16 16:52:28
    包含的头文件含有变量、函数、类的定义其他使用的地方多次包含,造成重复包含,产生LNK2005错误, 有两种解决方法: 1)使用宏 头文件head.h加入 #ifndef HEAD_H_ //这个地方写法有不少 #define HEAD_...

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

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

    展开全文
  • 全局变量应该头文件声明并加extern关键字,如下所示: #pragma once #include /* 初始化窗口有关的各种变量 */ int initWindow(char * title); /* 关闭Window */ void releaseWindow(); // 窗口 extern SDL_...

    今天第一次遇到多文件包含的问题,一般来说C++开发都是声明放在头文件里,实现放在源文件里,然后使用时包含头文件,头文件为了避免被重复编译,一般来说要加个杂注“#pragma once ”,或者直接用“#ifndef XXX ....#endif”来处理。好吧,这些我都知道,偏偏各种办法都用遍了,extern也加了,就是一直给我报下面那个错:



    折腾了半天,终于让我给折腾好了。


    全局变量应该在头文件中声明并加extern关键字,如下所示:

    
       
    1. #pragma once
    2. #include<SDL.h>
    3. /* 初始化窗口有关的各种变量 */
    4. int initWindow(char * title);
    5. /* 关闭Window */
    6. void releaseWindow();
    7. // 窗口
    8. extern SDL_Window * window;
    9. // 渲染器
    10. extern SDL_Renderer * render;
    11. // 窗口大小
    12. const int WINDOW_W = 330;
    13. const int WINDOW_H = 500;


    然后使用时,在源文件中初始化(暂时不知道为什么,先这么写),如下:

    
       
    1. // 窗口
    2. SDL_Window * window = nullptr;
    3. // 渲染器
    4. SDL_Renderer * render = nullptr;


    最后编译通过。这应该是C++新手容易犯的错吧。

    展开全文
  • C++ error:LNK2005 已经在*.obj中定义

    千次阅读 2018-09-17 17:01:24
    test01@@YAHXZ) 已经在 ShellExecuteTest.obj 中定义 Test E:\c++learning\workspace\python\Test\Test\Test.obj 二、解决方法 这个错误很简单,只是因为一个c++项目定义了两个一样的方...
  • error:LNK2005 已经在*.obj中定义的一种情况及解决办法

    万次阅读 多人点赞 2018-11-29 16:34:45
    经过仔细看代码发现,我的情况是这样的一个全局变量一个头文件中定义,比如:head1.h中定义了全局变量int a = 10; 一个类的头文件class.h包含了头文件head1.h如:include "head1.h" 于是我将...
  • error:LNK2005 已经在*.obj中定义

    千次阅读 2015-04-26 11:00:54
    “error LNK2005: 已经在*.obj中定义”   编程经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原因,就可以轻松解决它了。  造成LNK2005错误主要有以下...
  • 这是头文件(标头.h) ![图片说明](https://img-ask.csdn.net/upload/201908/12/1565612607_458039.jpg) 然后这个是cpp文件 ![图片说明]...
  • “error LNK2005: 已经在*.obj中定义”   编程经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原因,就可以轻松解决它了。  造成LNK2005错误主要有以下...
  • error LNK2005:"XXX已经在 XXX.obj 中定义

    千次阅读 2018-02-27 00:09:01
    全局变量应该头文件声明并加extern关键字,如下所示: #pragma once #include /* 初始化窗口有关的各种变量 */ int initWindow(char * title); /* 关闭Window */ void releaseWindow(); // 窗口 extern ...
  • 错误 LNK2005 xxx已经在 xxx.obj 中定义

    千次阅读 2020-06-03 21:49:38
    /////////问题所在 而系统编译的是cpp文件,每一个cpp文件都会生成一个obj文件 最终导致 Singleton * Singleton::m_Instance 被定义了两次,以至于出现了 “错误 LNK2005 xxx已经在 xxx.obj 中定义” 解决办法就是将 ...
  • 出现原因 如图所示,原因是项目有多...“项目”——“**属性”打开的对话框,选择“配置属性”——“链接器”——“命令行”添加代码"/FORCE:MULTIPLE"即可。 参考:https://www.jingwen.love/227.html ...
  • 编程经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以轻松解决它了。    造成LNK2005错误主要有以下几种情况:  1.重复定义全局变量。可能...
  • 问题: 情况是这样的一个全局变量一个头文件中定义, 比如:head1.h中定义了全局变量 int a = 10; 另外一个类的头文件class.h包含...已经在*.obj中定义 解决办法: 首先保证无重名变量的重定义出现,然后将定义
  • error:LNK2005 _main 已经在 *.obj 中定义

    万次阅读 2017-06-13 00:03:38
    正确的应该是一个CPP文件中定义如下:int g;那么使用的CPP文件就应该使用:extern int g (1)声明必须使用extern关键字; (2)不能给变量赋初值 2.头文件的包含重复。此时应该头文件设置 相关的宏
  • >> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义 fatal error LNK1169: 找到一个或多个多重定义的符号 【可能的原因】 当第一个使用该头文件的.cpp文件生成.obj的时,int i 已经...
  •  但是2.h包含了1.h,所以1.h中定义的变量编译的时候会2.pp定义。于是乎2.cpp翻译成的obj里也会有定义,结果导致提示obj里重定义。 但是我们可以这样实现: 1、GrobalPar.h中定义所有的全局变量; ...
  • LNK2005,主程序调用其他CPP里的静态函数,去掉...LNK2001,已经在.OBJ文件中定义,查了下谷歌,说什么重复定义什么的,但我引用的是别人的源码库,我又不能改,解决方法很简单,直接移除该函数所在CPP就行了。 ...
  • 有B和A两个代码,文件B.obj中报错“已经在A.obj文件中定义的解决办法XXX” 报错原因是重复定义 把A或者B 里面任意一方的XXX注释掉即可解决。
  • C++的“error:LNK2005 已经在*.obj中定义”异常问题  异常现象如下:   C++的“error:LNK2005 已经在*.obj中定义”异常问题(图1)  “error LNK2005: 已经在*.obj中定义”  编程经常能遇到LNK...
  • vs error lnk2005 test.obj:”struct MyStruct *”已经在map.obj中定义原因分析 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 头文件map.h...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,870
精华内容 3,148
关键字:

lnk2005已经在obj中定义