尝试使用DirectXTK创建GamePad时出现错误LNK2019

时间:2016-04-05 18:55:36

标签: c++ directx-11


我正在关注如何将GamePad纳入我的应用程序的DirectXTK GamePad tutorial,但是在尝试创建GamePad时我得到 errorLNK2019

到目前为止,我已经:

  • GamePad.h 添加到我的 Controller 头文件

  • std::unique_ptr<DirectX::GamePad> mGamePad;
    

    在我的控制器类

  • 在Controller :: Init()中添加了

    mGamePad = std::make_unique<GamePad>();
    

当我添加最后一行代码时,我会收到错误(loong):

DirectXTK.lib(GamePad.obj) : error LNK2019: unresolved external symbol __imp_RoGetActivationFactory referenced in function "long __cdecl ABI::Windows::Foundation::GetActivationFactory<struct ABI::Windows::Gaming::Input::IGamepadStatics>(struct HSTRING__ *,struct ABI::Windows::Gaming::Input::IGamepadStatics * *)" (??$GetActivationFactory@UIGamepadStatics@Input@Gaming@Windows@ABI@@@Foundation@Windows@ABI@@YAJPEAUHSTRING__@@PEAPEAUIGamepadStatics@Input@Gaming@12@@Z)
DirectXTK.lib(GamePad.obj) : error LNK2019: unresolved external symbol WindowsCreateStringReference referenced in function "private: void __cdecl Microsoft::WRL::Wrappers::HStringReference::CreateReference(wchar_t const *,unsigned int,unsigned int)" (?CreateReference@HStringReference@Wrappers@WRL@Microsoft@@AEAAXPEB_WII@Z)
fatal error LNK1120: 2 unresolved externals

在我的应用程序中,我已经使用了SpriteBatch而没有任何问题,所以当我将DirectXTK包含在我的解决方案中时,我猜我已经做了所有正确的事情。

我也尝试使用

创建GamePad
mGamePad.reset( new GamePad() );

我在本教程的older version中找到了。

另外..插入控制器.. 关于我做错的任何建议?谢谢!

2 个答案:

答案 0 :(得分:3)

您必须将项目与RuntimeObject.lib

相关联

答案 1 :(得分:1)

当DirectX Tool Kit的GamePad类是为Windows 10构建的(即_WIN32_WINNT=0x0A00)时,它使用新的Windows.Gaming.Input Windows运行时类而不是XINPUT。

如果您正在为通用Windows平台构建,那么您已经初始化了Windows运行时_WIN32_WINNT=0x0a00,并且可能会链接到RuntimeObject.lib

如果您正在构建Windows桌面(又名Win32或“经典”应用程序),那么首先要确保您真的打算仅为Windows 10制作它。 DirectX工具包有一个plethora of different vcxproj files,具体取决于您所定位的平台。如果您确实希望仅使用Windows桌面应用程序定位Windows 10,那么这非常酷,但您需要为您的应用程序显式初始化Windows运行时。

TL; DR:如果您要制作需要Windows 10的Windows桌面应用,请与RuntimeObject.lib关联并将其添加到您的应用初始化中(替换CoInitializeCoInitializeEx):

Microsoft::WRL::Wrappers::RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
if (FAILED(initialize))
    return 1;

如果您没有制作需要Windows 10的Windows桌面应用程序,并且您没有制作通用Windows平台(UWP)应用程序,那么请使用为Windows 7兼容性而构建的不同版本的DirectX工具包。

请参阅this post