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

Unresolved external symbol already defined when creating class

本文关键字:外部 符号 定义 创建      更新时间:2023-10-16

我正在努力理解为什么这个符号没有定义,尽管它是在主.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;
};

皇冠包含.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"

皇冠.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;
}

主.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)

你现在可能已经想通了,但无论如何,我都会为未来的读者回答。

如果您使用的是 C++11(或更高版本)并且只想将procHandle初始化为null

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

大功告成。

我认为您混淆了两种不同的pHandle标识符。main()中定义了pHandle,但它是局部变量,与错误所指Global::Settings::pHandle不同。您尚未提供后者的代码,因此仅根据错误,您尚未对其进行初始化Global.cppSettings.cpp(Global::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;
//...