精华内容
下载资源
问答
  • cppobj再到exe,重定义的问题

    千次阅读 2017-03-29 10:15:50
      include的目的是我们可能会当前的cpp中使用其他cpp内定义的东西,但是我们不可以直接include该cpp,因为这会导致链接的时候出现重定义的错误(cpp本身有一份定义,又被别人include了一份定义,链接的时候就...

    这里写图片描述

    上述过程分为两步:
    (1)每个cpp先生成各自对应的obj即编译单元;
    (2)最后通过链接器把所有obj链接成一个exe形成一个程序。
    而重定义在这两步之中都可能发生。
    第一步中,如果一个cpp内不小心定义了多份(>=2)相同数据,在生成obj,还没链接前就已经报错了。
    第二步也是最常出现重定义的地方。你可能不小心地在两个cpp中定义了相同的数据,各自生成obj的时候并不会报错,但是当链接的时候就会出现重定义。或者你的项目的多份cpp都include了同一份.h文件,而这个.h文件存在定义,一样的,在各自生成obj的时候不会报错(如果没有其他的重定义的话),但是当链接的时候就会报错。

    展开全文
  • 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里遇到重定义,  会忽略为声明.

    展开全文
  • 然后A.cpp包含了该.h,B.cpp包含了该.h,于是链接的时候,生成A.obj,B.obj,但是 .h中定义的变量会这两个obj中又被定义,所以,导致了这个LINK2005错误。 解决方法:不要.h中定义变量!!.h中只声明函数,...

    当项目代码比较多,文件也比较多的时候,这个问题真的非常棘手,可能会耗费大量的时间来排查错误。

     问题出现的原因:在.h文件中定义了变量。然后A.cpp包含了该.h,B.cpp包含了该.h,于是在链接的时候,生成A.obj,B.obj,但是 .h中定义的变量会在这两个obj中又被定义,所以,导致了这个LINK2005错误。
    
    解决方法:不要在.h中定义变量!!在.h中只声明函数,类。把具体的实现都必须要放到.cpp中!!!!
    

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

    万次阅读 2016-01-15 14:23:20
    实习项目中涉及到静态库的编写,用实例调试静态库的时候,遇到LNK2005重复定义错误:已经“*.obj中定义。 上网搜了一下,总结有如下几种情况: 1、重复定义全局变量 全局变量是针对整个工程的,一个CPP...

    实习项目中涉及到静态库的编写,在用实例调试静态库的时候,遇到LNK2005重复定义错误:已经在“*.obj”中定义。

    上网搜了一下,总结有如下几种情况:

    1、重复定义全局变量

    全局变量是针对整个工程的,在一个CPP文件的定义:int nCount;那么在使用的CPP文件中就应该使用extern int nCount即可,如果还是使用int nCount 就会产生LNK2005错误;

    根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:

    1)使用extern 关键字  2)不能给变量赋初值

    2、头文件的重复包含

    包含的头文件中含有变量、函数、类的定义,在其他使用的地方多次包含,造成重复包含,产生LNK2005错误,

    有两种解决方法:

    1)使用宏 在头文件head.h中加入

     #ifndef HEAD_H_ 

    #define HEAD_H_

    ......

    #endif

    2)使用预编译,文件开头加入

    #pragma once

    3、使用第三方库造成

    主要情形是C运行期函数库和MFC的库冲突造成的。具体的方法就是将提示出错的库放到另一个库的前面。

    举例:

    #include <WinSock2.h>
    //WinSock2.h头文件必须在Windows.h之前
    #include <Windows.h>



    参考文章:http://www.cnblogs.com/MuyouSome/p/3332699.html

    展开全文
  • 注意,.h文件应最好只包含声明而无定义,因为.h文件可能会被.cpp文件引用多次,这样会产生“重定义”的错误,同时可以使含main函数的.cpp文件更加简洁。 如图: | | | | | | | | 其他...
  • 近来写工程:想把一个变量多个cpp文件使用,写了类似如下代码: main.cpp: #include "A.h" #include "B.h" extern w;//对w的extern声明 main() { do(w);//对W进行操作 } A.h: w;//w的声明 B.h #include...
  • .h中定义的全局变量移到.cpp中
  • C++ error:LNK2005 已经*.obj中定义

    万次阅读 2016-06-07 23:01:36
    test2@@YAXXZ) 已经 源2.obj 中定义 fatal error LNK1169: 找到一个或多个多重定义的符号 问题在于没有把握清楚头文件的作用以及CPP之间函数与变量命名方式的规则: 头文件的内容: ★ 类型
  • 然后A.cpp包含了该.h,B.cpp包含了该.h,于是链接的时候,生成A.obj,B.obj,但是 .h中定义的变量会这两个obj中又被定义,所以,导致了这个LINK2005错误。  解决方法:不要.h中定义变量!!.h中只声明函数...
  • error:LNK2005 _main 已经 *.obj 中定义

    万次阅读 2017-06-13 00:03:38
    正确的应该是一个CPP文件中定义如下:int g;那么使用的CPP文件中就应该使用:extern int g (1)声明必须使用extern关键字; (2)不能给变量赋初值 2.头文件的包含重复。此时应该头文件中设置 相关的宏
  • 造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: ... 正确的应该是一个CPP文件中定义如下:  int g_Test;  那么使用的CPP文件中就应该使用:  extern int g_Tes...
  • 本人遇到的情况: 1、该函数定义在了头文件:把该函数的声明和定义分开,声明头文件定义在.cpp文件。 未完待续。。。
  • 写了一个main.cpp 一个Singleton.h和一个Singleton.cpp Singleton.h #pragma once class Singleton { public: static Singleton* GetInstance() { if (m_Instance == nullptr) m_Instance = new Singleton();...
  • 遇到这种问题一般是因为全局变量定义的时候只头文件里进行声明,而没有再CPP文件中定义。详细见网址:https://www.cnblogs.com/MuyouSome/p/3332699.html
  • C++LNK2005 某函数已经.obj中定义

    千次阅读 2018-05-10 12:27:20
    原因:调用函数时错将.cpp文件包含解决办法,将#include “xxx.cpp”改为#include“xxx.h”
  • 错误 LNK2005 “public: __thiscall已经 main.obj 中定义 解决办法:这个问题就是vs自动生成的构造函数和析构函数没有删除移动到cpp文件中而该hpp文件又被引用了 构造函数从.h文件修改到.cpp文件下可以解决。
  • 无意遇到了这样的编译问题, 于是google,发现.h文件里定义变量,发生这问题的概率是灰常大的.   下面这段红字是参考网上的说法:   当你第一个使用这个头的.cpp文件生成.obj的时候,int i ...
  • 某个函数,不同的cpp文件有重复的定义,即有2个函数体的实现; 2.调用某个函数时,无法确定调用哪个,即函数参数类型或个数无法匹配; 3.动态性声明错误如果定义(.H文件)声明了使用动态性,则类实现部分...
  • 关于VS2008编译错误"error LNK2005: 已经 .obj 中定义"  无意中遇到了这样的编译问题, 于是google,发现.h文件里定义变量,发生这问题的概率是灰常大的.   下面这段红字是参考网上的说法:   当...
  • 建好的项目下有一个 HelloCApp.cpp ,里面有个 main 方法。 这时又源文件下新建 main.c ,写了输出 Hello World ctrl+f5 时报错,搜了下看到这个 链接器工具错误LNK2005 里面受到启发, ...
  •  多重包含含有变量定义的.h文件所造成  这个现象很容易重新,首先新建一个1.h文件,然后里面写下如下代码 #pragma once int i = 0; 然后新建一个1.cpp,里面代码如下: #include "1.h" 再新建一个2.cpp,代码...
  • _DllMain 这个已经解决方案中的dllmain.cpp中已经定义过,删除即可
  • That’s because STB_IMAGE_IMPLEMENTATION needs to be defined within a .c or .cpp file, not within a header. When you define STB_IMAGE_IMPLEMENTATION, you are creating the bulk of t...
  •   很多人应该都遇到过如题所示的重定义问题,原因就是由于头文件的重复包含...但是这两种方式对于头文件中定义全局函数的方法无解。    正确的解决方法:将全局函数的声明放在头文件,而定义放在cpp之中。 ...
  • 为什么类的定义应当写头文件,从而被多个源文件包含?比如myclass.h定义了一个类myclass(只定义类,不定义成员函数), file1.cpp里#include "myclass.h",编译得到file1.obj; file2.cpp里也#include "myclass....
  • 1、C++正常对静态成员变量必须类外进行初始化,但是不能为了方便,然后就这样初始化: 自己给自己就挖了坑,必须放在cpp文件进行初始化工作: 这样你才避开了上面的坑,好的 ...
  • 工程中有一个can.cpp文件内定义了很多变量和函数,就想把这部分定义搬出来新建一...error LNK2005:xxx已can.obj中定义fatal error LNK1169: 找到一个或多个多重定义的符号。工程文件夹的debug目录下发现vars.cpp

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 469
精华内容 187
关键字:

在cpp中定义obj