我用vc做的一支程式,在link时出现如下现象:
"(?frame_no@@3HA) already defined in smbtest.obj",是什么原因造成的?
如下:
mbtestDlg.obj : error LNK2005: "struct PortAddrTable *  PortListAddrTable" (?PortListAddrTable@@3PAUPortAddrTable@@A) already defined in smbtest.obj
smbtestDlg.obj : error LNK2005: "int  frame_no" (?frame_no@@3HA) already defined in smbtest.obj
smbtestDlg.obj : error LNK2005: "long  interpacketGap" (?interpacketGap@@3JA) already defined in smbtest.obj
smbtestDlg.obj : error LNK2005: "int  packetlength" (?packetlength@@3HA) already defined in smbtest.obj
smbtestDlg.obj : error LNK2005: "int  iHub" (?iHub@@3HA) already defined in smbtest.obj
我并没有在其它头文件中重复定义啊?

解决方案 »

  1.   

    重复定义,仔细检查一下你的#include "……" 的语句,有没有类似main.cpp 文件
    #include "a.h"
    #include "b.h"
    ……a.h 文件
    #include "b.h"这样的情况
    有的话,删除main.cpp中的#include "b.h"
    完后一定要 rebuild all。
      

  2.   

    这个问题最常见的一种产生方式是:将类的声明与定义分开, 并且声明与定义放在同一个文件里, 而这个文件被多个 cpp 文件所包含. 就产生了这样的already defined 错误. 
    例如有一个 .h 文件如下:#pragma once//既包含class A声明
    class A
    {
    public:
      A();private:
      int i;
    };
    //也包含了定义
    A::A()
    {
      i = 0;
    }就会有问题.针对的解决办法是:
    1.将声明与定义分开存放, 放在两个文件, 声明放在头文件, 定义放在实现文件(.cpp)
    2.将声明与定义混合起来, 声明即是定义. 如:
            class A
            {
            public:
               A() 
               {
                 i=0;
               }
            private:
               int i;
            }
      

  3.   

    都在.cpp中做最好 .h 中能不#include 就不#include
      

  4.   

    最根本的产生原因是编译阶段完成后, 一个符号存在于多个目标 (.obj) 文件中. 
    我说的只是错误产生的一种方式, 还有很多其他的. 这里贴出 msdn 一段供你看看:
    链接器工具错误 LNK2005在对象中已定义符号以修饰形式显示的给定 symbol 被多次定义。可能的原因 不慎同时与单线程库和多线程库链接。确保应用程序项目文件只包括适当的库,并且任何第三方库已适当创建了单线程或多线程版本。 
    该符号为封装函数(通过用 /Gy 编译创建),包含在多个文件中,但在各编译间已改变。重新编译所有包含 symbol 的文件。 
    以不同的形式在不同库中的两个成员对象中定义了该符号,并且使用了这两个成员对象。 
    某个绝对符号被定义两次,而每次定义的值不同。 
    头文件声明并定义了变量。可能的解决方案有: 
    在 .h 中声明变量:extern BOOL MyBool;,然后在 .c 或 .cpp 文件中向它分配:BOOL MyBool = FALSE;。 
    将变量声明为 Static。 
    将变量声明为 selectany。 
    当将 uuid.lib 与定义 GUID 的其他 .lib 文件(例如 oledb.lib 和 adsiid.lib)一起使用时。例如: 
    oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
    already defined in uuid.lib(go7.obj)
    若要修复,请将 /FORCE:MULTIPLE 添加到链接器命令行选项,并确保 uuid.lib 是引用的第一个库。 有关更多信息,请参阅知识库文章: Q148652,PRB: LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries。 
    Q140440,FIX: Global Overloaded Delete Operator Causes LNK2005。 
    Q184235,PRB: LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT。 
    该错误之后为致命错误 LNK1169。
      

  5.   

    to windows_editor(色即是空):
    都在 cpp 中有一个不好, 每次修改都得重新编译所有的东西. 关于实现的物理结构, 还是有一定东西在里面的.STL 中一模板实现全部放在一个文件里. 
    MFC 中声明放头文件, 实现放CPP文件, 内联函数放 .inl 文件. 这是比较好的大项目方式.
    GDI+ 中全部分散在 .H 文件 里. 声明即是定义, 并且所有的头文件全部用 #include 指令包含在gdiplus.h头文件的 Gdiplus namespace 中.这是一种巧妙的方式