将 WRL 用于 C++/CX 函数 - 链接器错误 [重复]

Posted

技术标签:

【中文标题】将 WRL 用于 C++/CX 函数 - 链接器错误 [重复]【英文标题】:Using WRL for C++/CX functions - linker error [duplicate] 【发布时间】:2012-10-23 12:37:40 【问题描述】:

可能重复:What is an undefined reference/unresolved external symbol error and how do I fix it?

我正在尝试制作不使用 CX 扩展的 WinRT 库。我需要获取包的名称、漫游数据文件夹等。我写了一些包装器,但是当我将此库链接到可执行项目时,出现链接器错误

error LNK2019: unresolved external symbol _WindowsCreateStringReference@16 referenced in function "private: void __thiscall Microsoft::WRL::Wrappers::HStringReference::CreateReference(wchar_t const *,unsigned int,unsigned int)" (?CreateReference@HStringReference@Wrappers@WRL@Microsoft@@AAEXPB_WII@Z)
error LNK2019: unresolved external symbol _WindowsDeleteString@4 referenced in function "public: __thiscall Microsoft::WRL::Wrappers::HStringReference::~HStringReference(void)" (??1HStringReference@Wrappers@WRL@Microsoft@@QAE@XZ)
error LNK2019: unresolved external symbol _WindowsGetStringRawBuffer@8 referenced in function "long __cdecl aponialib::winrt::GetFullName(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &)" (?GetFullName@winrt@aponialib@@YAJAAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z)
error LNK2019: unresolved external symbol __imp__RoGetActivationFactory@12 referenced in function "long __cdecl Windows::Foundation::GetActivationFactory<struct ABI::Windows::Storage::IApplicationDataStatics>(struct HSTRING__ *,struct ABI::Windows::Storage::IApplicationDataStatics * *)" (??$GetActivationFactory@UIApplicationDataStatics@Storage@Windows@ABI@@@Foundation@Windows@@YAJPAUHSTRING__@@PAPAUIApplicationDataStatics@Storage@1ABI@@@Z)

这是包名包装器

// including in .h
#include <windows.h>
#include <string>
#include <Strsafe.h>
#include <Winstring.h>

#include <windows.storage.h>
#include <Windows.ApplicationModel.h>
#include <windows.Foundation.h>
#include <wrl/client.h>
#include <wrl/wrappers/corewrappers.h>

//...

HRESULT GetFullName(std::wstring &fullName)

    HRESULT hr;
    Microsoft::WRL::ComPtr<ABI::Windows::ApplicationModel::IPackageStatics> packageStatics;

    hr = Windows::Foundation::GetActivationFactory(Microsoft::WRL::Wrappers::HStringReference(RuntimeClass_Windows_ApplicationModel_Package).Get(), &packageStatics);
    if (FAILED(hr))
        return hr;

    Microsoft::WRL::ComPtr<ABI::Windows::ApplicationModel::IPackage> package;
    hr = packageStatics->get_Current(&package);
    if (FAILED(hr))
        return hr;

    Microsoft::WRL::ComPtr<ABI::Windows::ApplicationModel::IPackageId> packageId;
    hr = package->get_Id(&packageId);
    if (FAILED(hr))
        return hr;

    HSTRING name;
    hr = packageId->get_FullName(&name);
    if (FAILED(hr))
        return hr;

    UINT32 length;
    PCWSTR value = WindowsGetStringRawBuffer(name, &length);
    fullName = value;
    WindowsDeleteString(name);
    return S_OK;

也许我没有得到 WRL,而且我用错了。

感谢您的帮助 :) 托马斯

【问题讨论】:

What is an undefined reference/unresolved external symbol error and how do I fix it? 的可能副本。你在Failure to link against appropriate libraries/object files or compile implementation files的情况下。 @RaymondChen "查找 ... 文档,它应该说明哪个库" 当 WindowsCreateStringReference 的 MSDN 条目和大多数最近的 WinRT API 以及与 WRL 相关的任何内容都很轻时,这没有帮助和真正的 C++。值得庆幸的是,有人的社区内容填补了#pragma comment(lib,"runtimeobject") 填补需求的空白。 查看WindowsCreateStringReference、WindowsDeleteString 和WindowsGetStringRawBuffer 的文档并不能回答问题使用哪个 导入库和头文件Winstring.h 也不包含适当的#pragma comment(lib, "...") 指令。投票重新提出问题。 @RaymondChen :这不是重复的。许多开发人员都知道您所指出的问题的答案,但对于 WRL (msdn.microsoft.com/en-us/library/hh438466) 的新手来说,这个问题会更相关。 在附加链接器依赖项中添加 WindowsApp.lib (Linker-&gt;Input-&gt;Additional Dependencies) (来自 - ***.com/a/39759804/981766 , ***.com/questions/35578616/…) 【参考方案1】:

发生链接器错误我可能是原因

要么找不到函数定义

或者您忘记在项目属性中添加 .lib 文件

Project properties-->Linker-->Input-->Additional Dependencies

【讨论】:

我们都知道,为什么链接器在找不到符号时会报错。现在 100 万美元的问题是:需要哪个 导入库?没有这些信息,您的回答将毫无用处。

以上是关于将 WRL 用于 C++/CX 函数 - 链接器错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将弱符号和局部符号链接在一起时,可能的 GCC 链接器错误会导致错误

C ++扩展Windows WRL组件类不起作用

使用 MeshLab 结果将 .wrl (VRML) 转换为 .dae (COLLADA) 缺少颜色

WinRT WRL ABI 集合

如何在“native c ++”环境中使用WinRT IAsyncOperation *对象

如何在 Metro (C++/CX) 应用程序中解析日期?