当前位置: 主页 > 日志 > C/C++ >

vc6连接错误 “error LNK2005: * already defined in *.obj ”问题的解决及分析

// redice  7.14

在VC6.0 Win32 Application中使用NetFilter SDK做开发时遇到了一点小麻烦,问题描述如下:

eventHandler.h包含了EventHandler类的声明。

eventHandler.h文件包含了NetFilter SDK的两个头文件, "nfapi.h"和"nfutil.h"。

eventHandler.cpp文件包含eventHandler.h,eventHandler.cpp文件为EventHandler类的成员函数实现。

WebFilter.cpp为WinMain函数所在的文件,它也包含了eventHandler.h。

编译程序的时候,老是提示:

WebFilter.obj : error LNK2005: "int __cdecl nfapi::nf_getProcessName(unsigned long,char *,int)" (?nf_getProcessName@nfapi@@YAHKPADH@Z) already defined in EventHandler.obj
WebFilter.obj : error LNK2005: "void __cdecl nfapi::nf_adjustProcessPriviledges(void)" (?nf_adjustProcessPriviledges@nfapi@@YAXXZ) already defined in EventHandler.obj


反复查看,始终找到不问题的原因...
最终在不经意打开"nfutil.h",顿时恍然大悟,原来nf_getProcessName函数和nf_adjustProcessPriviledges函数的实现过程被放在"nfutil.h"文件中了。VC编译器在编译eventHandler.cpp并生成eventHandler.obj的时候会产生一个nf_getProcessName和nf_adjustProcessPriviledges函数,在编译WebFilter.cpp的时候又会产生一个nf_getProcessName和nf_adjustProcessPriviledges函数。连接的时候,连接器发现有两个“nf_getProcessName和nf_adjustProcessPriviledges”当然会报错了。


上面的程序有点复杂,似乎不太容易说明这个问题,下面用一个简单的程序说明一下:

  header.h  
   
  void   test()   {  
   
  }  
    
  src1.cpp:  
  #include   "header.h"  
   
  src2.cpp:  
  #include   "header.h" 
 
   
  编译通过,但是LINK时发生错误:  
   
  src2.obj : error LNK2005: "void __cdecl test(void)" (?test@@YAXXZ) already defined in src1.obj

  分析:src1.cpp和src2.cpp中都有关于test函数的实现,因此编译的时候会提示"already defined in ..."

[日志信息]

该日志于 2009-07-14 17:48 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “vc6连接错误 “error LNK2005: * already defined in *.obj ”问题的解决及分析” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部