创建类时已经定义的未解析的外部符号

时间:2017-05-07 18:24:43

标签: c++ symbols

我很难理解为什么这个符号没有定义,而是在main.cpp中定义的。代码如下:

记忆类:

#pragma once
#include "CrownIncludes.h"

class Memory {
public:
    template<typename T>
    inline T Read(std::uintptr_t ptrAddress) const
    {
        T val = T();

        ReadProcessMemory(procHandle, (LPCVOID)ptrAddress, &val, sizeof(T), NULL);
        return val;
    }
private:
    HANDLE procHandle = Settings::pHandle;
};

CrownIncludes.h

#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <Psapi.h>
#include <iostream>

#include "Global.h"
using namespace Global; 

#include "Crown.h"
#include "Memory.h"

Crown.cpp:

#include "CrownIncludes.h"
//#include "Memory.h"

void Crown::Setup() {
    std::cout << "Crown loading..." << std::endl;
    Memory* MemoryManager = new Memory();

    DWORD LocalPlayer = 0x0;
    MemoryManager->Read(0x02C8 + 0x0390, LocalPlayer);
    std::cout << LocalPlayer << std::endl;
}

Main.cpp的:

...
    std::cout << "Success! (" << TargetProcess->GetHandle() << ")" << std::endl;
    HANDLE pHandle = TargetProcess->GetHandle();

    // Main 
    Crown::Setup();
...

错误:

Fehler  LNK2001 Nicht aufgelöstes externes Symbol ""void * Global::Settings::pHandle" (?pHandle@Settings@Global@@3PEAXEA)" Crown.obj    

取消注释Memory * MemoryManager = new Memory();代码有效。 (所以我猜想记忆类无法找到pHandle)

1 个答案:

答案 0 :(得分:0)

你现在可能已经想到了,但不管将来的读者如何,我都会回答。

如果您正在使用C ++ 11(或更高版本),并希望简单地将procHandle初始化为null

// (Memory.h)
//...
HANDLE procHandle = nullptr;

你已经完成了。

我认为你混淆了两个不同的pHandle标识符。 pHandle中定义了main(),但它是一个局部变量,与错误引用的Global::Settings::pHandle不同。您没有为后者提供代码,因此仅基于错误而未在Global.cpp中初始化它  或Settings.cppGlobal::Settings的cpp文件)。

修复是确保在相关的cpp文件中初始化Global::Settings::pHandle

// (Global.cpp/Settings.cpp)
//...
HANDLE Global::Settings::pHandle = nullptr;

或者,在课堂上初始化它:

// (Global.h/Settings.h)
//...
HANDLE pHandle = nullptr;

Memory.h中,您正在初始化procHandleSettings::pHandle,根据错误以及您使用它做的事情表明Settings::pHandle不能是constexpr。数据成员只能在类中初始化为constexpr值,否则您将不得不使用构造函数,因为需要在运行时读取非constexpr值。

// If Settings::pHandle is constexpr. i.e. pHandle is a nullptr alias.
//...
    HANDLE procHandle = Settings::pHandle;
//...

// If Settings::pHandle is NOT constexpr.
//...
   Memory() :
       procHandle(Settings::pHandle) {}
//...
private:
    HANDLE procHandle;
//...