gpt4 book ai didi

c++ - 任何人都知道如何修复编译错误 : LNK2005?(内部源代码)

转载 作者:太空狗 更新时间:2023-10-29 23:31:58 25 4
gpt4 key购买 nike

我在 stdafx.h 中有以下代码。

using namespace std;

typedef struct {
DWORD address;
DWORD size;
char file[64];
DWORD line;
} ALLOC_INFO;

typedef list<ALLOC_INFO*> AllocList;
//AllocList *allocList;

没有注释代码(最后一行),它编译得很好。但是当我添加注释代码时,出现以下错误。

error LNK2005: "class std::list > * allocList" (?allocList@@3PAV?$list@PAUALLOC_INFO@@V?$allocator@PAUALLOC_INFO@@@std@@@std@@A) already defined in test.obj

我正在使用 Visual Studio .NET 2003。有人知道那是什么以及如何解决它吗?

最佳答案

不要将定义放在头文件中,只需声明。声明指定某些东西存在,而定义实际上定义它们(通过分配空间)。例如typedef , extern和函数原型(prototype)都是声明,而像 struct 这样的东西, int和函数体是定义。

发生的情况是,您很可能在多个编译单元(C++ 源文件)中包含了 stdafx.h,并且每个生成的目标文件都获得了自己的 allocList 拷贝。 .

然后,当您将这些对象链接在一起时,会出现两个(或更多)称为 allocList 的东西,因此出现链接错误。

你最好声明变量:

extern AllocList *allocList;

在您的头文件中并定义它在 C++ 源文件中的某处(例如 main.cpp ):

AllocList *allocList;

那样的话,每个包含stdafx.h的编译单元会知道外部变量,但它只在一个编译单元中定义。

根据您的进一步信息:

I was trying to follow http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml, I assume that all those code are meant to be placed in the stdafx.h. Any other alternatives, pax?

我的回复如下。

我不会把它们放在 stdafx.h 中我自己,因为我认为预编译头文件使用了一些 MS 魔法。

制作单独的头文件mymemory.h并将您的函数原型(prototype)放入其中,例如(请注意,它没有 body):

inline void * __cdecl operator new(
unsigned int size,
const char *file,
int line);

同样在该标题中,放置 AddTrack() 的其他原型(prototype), DumpUnfreed()等,以及 #define , typedefextern声明:

extern AllocList *allocList;

然后,在一个新文件中mymemory.cpp (其中还包含 #include "mymemory.h" ),放入 allocList 的实际定义连同所有实际功能(不仅仅是原型(prototype))并将该文件添加到您的项目中。

然后,#include "mymemory.h"在您需要跟踪内存的每个源文件中(可能是所有源文件)。因为头文件中没有定义,所以在链接过程中不会得到重复项,而且因为声明在那里,所以也不会得到 undefined reference 。

请记住,这不会跟踪您未编译的代码(例如第三方库)中的内存泄漏,但它应该让您了解自己的问题。

关于c++ - 任何人都知道如何修复编译错误 : LNK2005?(内部源代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/434522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com