在一个公用的头文件中, 定义了一个全局函数,然后其他DLL都引用这个头文件, 编译的时候提示错误
--------------------------------------------------------------------------
头文件定义:void SendErrorInfo(HWND hLogInfoWnd, LOG_TYPE sTYPE, CString sModule, CString sDepict)
{
LOG_INFO stLogInfo;

stLogInfo.sTYPE= sTYPE;
strcpy(stLogInfo.sModule, sModule);
strcpy(stLogInfo.sDepict, sDepict); COleDateTime dtTime= COleDateTime::GetCurrentTime();
strcpy(stLogInfo.sTime, dtTime.Format("HH-mm-dd"));

COPYDATASTRUCT cds;

cds.dwData=NULL;
cds.cbData=sizeof(LOG_INFO);
cds.lpData=(LPVOID)&stLogInfo;

::SendMessage(hLogInfoWnd, WM_COPYDATA, (WPARAM)NULL,(LPARAM)&cds);
}------------------------------------------------------------------------
编译错误:
LogInfoDlg.obj : error LNK2005: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj
LogInfoDlg.obj : error LNK2005: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj
LogInfoDlg.obj : warning LNK4006: "void __cdecl SendErrorInfo(struct HWND__ *,enum LOG_TYPE,class CString,class CString)" (?SendErrorInfo@@YAXPAUHWND__@@W4LOG_TYPE@@VCString@@2@Z) already defined in LogInfo.obj; second definition ignored

解决方案 »

  1.   

    头文件中不该有定义,而是声明。定义应放在cpp中。达dll?还有记得要extern "C"
      

  2.   

    把函数的的定义放到一个cpp中, 然后在头文件里只要包含
    void SendErrorInfo(HWND hLogInfoWnd, LOG_TYPE sTYPE, CString sModule, CString sDepict);
    就可以了
      

  3.   

    如果是的话,引用头文件的时候注意使用
    #ifndef
    ...
    #endif
      

  4.   

    是重复包含的问题。
    函数应该在头文件中定义,在cpp文件中实现
      

  5.   

    头文件一般只做数据的声明而不做定义,如果头文件中有函数的定义,则为请求编译器将该函数作inline处理。
    如果你不小心而导致了该头文件被包含多于一次,就会出现 "already defined..."连接错误。如果你想有效的避免头文件多次包含,可以考虑用宏定义。
    //myheader.h
    #ifndef MYHEADER_H
    #define MYHEADER_H
    class MyClass
    {
    ...
    }
    #endif在你需要包含该头文件的地方,使用下面的方法:
    #ifndef MYHEADER_H
    #include "myheader.h"
    #endif
      

  6.   

    在头文件中加入预编译命令,防止重复定义
    #if!def _YOURHEAD_H
    #define _YOURHEAD_H
    .
    .
    .
    #endif
      

  7.   

    加入#if!def _YOURHEAD_H
    #define _YOURHEAD_H
    .
    #endif
    也是没有用的.要么只在一个文件中使用该头文件,要么将实现另找个CPP文件来写.否则因为VC的基本编译单元是CPP文件,对每个包含此文件的CPP都将生成函数体.
      

  8.   

    谢谢大家,我加了个static 解决了这个问题:)