编译错误“已定义”

时间:2013-10-02 13:20:39

标签: c++

看起来像这样:

error LNK2005: "unsigned long __cdecl GetModuleBase(void *,
class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> > &)" 
(?GetModuleBase@@YAKPAXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 
already defined

我最近添加的代码:

#include "Windows.h"
#include <TlHelp32.h>
#include <psapi.h>
#include <string>
#pragma comment(lib, "psapi")
//#pragma comment(lib, "TlHelp32") i could not find where this lib located
using namespace std;

DWORD GetModuleBase(HANDLE hProc, string &sModuleName) 
{ 
   HMODULE *hModules; 
   char szBuf[50]; 
   DWORD cModules; 
   DWORD dwBase = -1; 
   //------ 

   EnumProcessModules(hProc, hModules, 0, &cModules); 
   hModules = new HMODULE[cModules/sizeof(HMODULE)]; 

   if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules)) { 
      for(int i = 0; i < cModules/sizeof(HMODULE); i++) { 
         if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) { 
            if(sModuleName.compare(szBuf) == 0) { 
               dwBase = (DWORD)hModules[i]; 
               break; 
            } 
         } 
      } 
   } 

   delete[] hModules; 

   return dwBase; 
}

我不明白这是什么,也许我使用错误的代码? 或者需要TlHelp32.lib,但VS说它找不到这样的静态库。

2 个答案:

答案 0 :(得分:4)

命名空间Microsoft::WRL中有GetModuleBase function

您的代码包含Microsoft的功能(在项目的另一部分,它是内部的),因此在链接阶段它会引发错误。

更改函数名称或使用命名空间。

答案 1 :(得分:0)

您的GetModuleBase()函数定义了两次,链接器无法解决该冲突。搜索“ GetModuleBase”,您将找到它。

理想情况下,您将在标头中一次声明函数原型,如下所示:

DWORD GetModuleBase(HANDLE hProc, string &sModuleName);

在标头文件的顶部使用标头保护或至少使用此预处理程序指令:

#pragma once

然后在.cpp文件中定义一次GetModuleBase(),在此.cpp文件中,您需要包括头文件。删除此函数的所有其他声明或定义,即可解决您的问题。

每当您遇到此问题时,快速的解决方案是CTRL-F打开查找提示并搜索函数名称,您将使用此方法快速识别冲突。