配置DirectXTK鼠标键盘遇未解析外部符号及构造器已删除错误求助
解决DirectXTK鼠标键盘输入的未解析外部符号与unique_ptr构造问题
我帮你分析下遇到的这两个问题,都是配置DirectXTK输入时的常见坑,一步步来解决:
一、未解析外部符号错误(链接阶段问题)
这个错误本质是编译器找到了函数声明,但链接器找不到对应的实现代码,通常是没正确链接DirectXTK的库文件:
- 如果是手动编译DirectXTK源码:
- 先把DirectXTK的项目编译成静态库(Debug版生成
DirectXTKd.lib,Release版生成DirectXTK.lib); - 打开你的项目属性,转到链接器 -> 输入,在「附加依赖项」里添加对应的库文件(Debug加
DirectXTKd.lib,Release加DirectXTK.lib); - 同时在链接器 -> 常规的「附加库目录」里,添加DirectXTK编译生成的lib文件所在的路径。
- 先把DirectXTK的项目编译成静态库(Debug版生成
- 如果是用NuGet安装的DirectXTK:
通常NuGet会自动配置链接,但如果还是报错,检查项目是否启用了NuGet包的自动还原,或者手动确认链接器的依赖项里是否包含了DirectXTK的库。 - 额外注意:确保你的项目和DirectXTK使用相同的运行时库(比如都是MD/MDd,或者都是MT/MTd),不同的话也会导致链接失败。
二、InputHandler构造函数被删除的问题(unique_ptr独占性导致)
std::unique_ptr是独占所有权的智能指针,它的拷贝构造和拷贝赋值默认是被删除的。如果你的InputHandler类里包含unique_ptr成员,编译器会自动删除InputHandler的拷贝构造和拷贝赋值函数,这就是报错的原因:
- 正确初始化unique_ptr成员:
在InputHandler的构造函数里,用初始化列表或make_unique来创建Mouse和Keyboard实例,比如:#include <memory> // 别忘了包含memory头文件 #include "DirectXTK-master\Inc\Mouse.h" #include "DirectXTK-master\Inc\Keyboard.h" class InputHandler { public: InputHandler() = default; InputHandler(HWND wndHandle) : m_mouse(std::make_unique<DirectX::Mouse>()), m_keyboard(std::make_unique<DirectX::Keyboard>()) { m_mouse->SetWindow(wndHandle); } ~InputHandler() = default; // 显式删除拷贝构造和赋值,避免编译器自动生成但报错 InputHandler(const InputHandler&) = delete; InputHandler& operator=(const InputHandler&) = delete; // 如果需要移动语义,可以保留默认的移动构造和赋值 InputHandler(InputHandler&&) = default; InputHandler& operator=(InputHandler&&) = default; void updateInput() { // 处理输入更新,比如获取鼠标状态 auto mouseState = m_mouse->GetState(); auto kbState = m_keyboard->GetState(); } private: std::unique_ptr<DirectX::Mouse> m_mouse; std::unique_ptr<DirectX::Keyboard> m_keyboard; }; - 避免错误的拷贝操作:
不要尝试拷贝InputHandler实例(比如InputHandler a = b;这样的代码),如果需要传递实例,用移动语义(std::move)或者使用指针/引用。
额外检查点
- 确认代码里正确使用了
DirectX::命名空间,比如DirectX::Mouse而不是遗漏命名空间; - 头文件路径配置正确:项目属性 -> C/C++ -> 常规 -> 附加包含目录,要添加DirectXTK的
Inc文件夹路径; - 确保Windows SDK版本和DirectXTK要求的一致,避免头文件和库版本不匹配。
内容的提问来源于stack exchange,提问作者Hamaro
相关产品推荐
相关产品推荐

