You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置DirectXTK鼠标键盘遇未解析外部符号及构造器已删除错误求助

解决DirectXTK鼠标键盘输入的未解析外部符号与unique_ptr构造问题

我帮你分析下遇到的这两个问题,都是配置DirectXTK输入时的常见坑,一步步来解决:

一、未解析外部符号错误(链接阶段问题)

这个错误本质是编译器找到了函数声明,但链接器找不到对应的实现代码,通常是没正确链接DirectXTK的库文件:

  • 如果是手动编译DirectXTK源码:
    1. 先把DirectXTK的项目编译成静态库(Debug版生成DirectXTKd.lib,Release版生成DirectXTK.lib);
    2. 打开你的项目属性,转到链接器 -> 输入,在「附加依赖项」里添加对应的库文件(Debug加DirectXTKd.lib,Release加DirectXTK.lib);
    3. 同时在链接器 -> 常规的「附加库目录」里,添加DirectXTK编译生成的lib文件所在的路径。
  • 如果是用NuGet安装的DirectXTK:
    通常NuGet会自动配置链接,但如果还是报错,检查项目是否启用了NuGet包的自动还原,或者手动确认链接器的依赖项里是否包含了DirectXTK的库。
  • 额外注意:确保你的项目和DirectXTK使用相同的运行时库(比如都是MD/MDd,或者都是MT/MTd),不同的话也会导致链接失败。

二、InputHandler构造函数被删除的问题(unique_ptr独占性导致)

std::unique_ptr是独占所有权的智能指针,它的拷贝构造和拷贝赋值默认是被删除的。如果你的InputHandler类里包含unique_ptr成员,编译器会自动删除InputHandler的拷贝构造和拷贝赋值函数,这就是报错的原因:

  1. 正确初始化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;
    };
    
  2. 避免错误的拷贝操作:
    不要尝试拷贝InputHandler实例(比如InputHandler a = b;这样的代码),如果需要传递实例,用移动语义(std::move)或者使用指针/引用。

额外检查点

  • 确认代码里正确使用了DirectX::命名空间,比如DirectX::Mouse而不是遗漏命名空间;
  • 头文件路径配置正确:项目属性 -> C/C++ -> 常规 -> 附加包含目录,要添加DirectXTK的Inc文件夹路径;
  • 确保Windows SDK版本和DirectXTK要求的一致,避免头文件和库版本不匹配。

内容的提问来源于stack exchange,提问作者Hamaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:41:14