好的' LNK2001

时间:2017-07-27 14:52:06

标签: c++ header linker

我有3个标题 DirectX.hDraws.hMemory.h d

每个函数在其相应的.cpp中都有一个定义,因此除了DirectX.h ofc之外,它被排除在外 我尝试了一套解决方案来修复它但没有成功,就像在标题中没有including stdafx.h一样。

三个小片段

Memory.h

        #pragma once
        #include "stdafx.h"
        Class Memory
        {
        foo.. 
        };
        extern Memory *gMemory;

Draws.h

#pragma once
#include "stdafx.h"
Class Drawing
{
foo..
};
extern Drawing *Draw;

DirectX.h

#pragma once
#include "stdafx.h"
struct Direct
{
foo
};
extern Direct *DirectX;

错误

1>dllmain.obj : error LNK2001: unresolved external symbol "class Memory * gMemory" (?gMemory@@3PAVMemory@@A)
1>dllmain.obj : error LNK2001: unresolved external symbol "class Drawing * Draw" (?Draw@@3PAVDrawing@@A)
1>dllmain.obj : error LNK2001: unresolved external symbol "struct Direct * DirectX" (?DirectX@@3PAUDirect@@A)
1>Draws.obj : error LNK2001: unresolved external symbol "struct Direct * DirectX" (?DirectX@@3PAUDirect@@A)

stdafx.h中

#include <windows.h>
#include <iostream>
#include <d3d9.h>
#include <d3dx9.h>

#include "Memory.h"
#include "Draws.h"
#include "DirectX.h"

dllmain.cpp 我使用extern的唯一部分是

gMemory->FindPattern(..);
if (!DirectX->Line)
    {
    D3DXCreateLine(pDevice, &DirectX->Line);
    }
    Draw->Circle(foo);

1 个答案:

答案 0 :(得分:0)

extern关键字意味着,该对象在其他地方定义(在其他编译单元中,在链接的静态库中),简单来说,它是对象的链接,在某处实例化(创建) else,但可以在当前的编译单元中使用。

在你dllmain.cpp中,你应该在全局(例如)范围内声明变量:

// Declaration of pointers.
Drawing* Draw = NULL;
Direct* DirectX = NULL;
Memory* gMemory = NULL;

int dllmain()(或任何主要功能):

// Initialization of pointers with newly created objects:
Draw = new Drawing();
DirectX = new Direct();
gMemory = new Memory();