尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时出现无法解析的外部符号 winrt_make_*
I'm getting unresolved external symbol winrt_make_* when trying to compile C++/WinRT blank app from XamlApplication
我正在尝试按照此处的教程进行操作:UWP Xaml Hosting API.
我在教程的一部分应该创建一个定义 XamlApplication
应用程序的空白应用程序。我在 header (.h) 中将其定义为:
#pragma once
#include "App.xaml.g.h"
namespace winrt::UI_Host::implementation
{
struct App : Microsoft::Toolkit::Win32::UI::XamlHost::XamlApplicationT<App>
{
App();
~App();
};
}
我的 .cpp 文件定义为:
#include "pch.h"
#include "App.h"
using namespace winrt;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Navigation;
using namespace UI_Host;
using namespace UI_Host::implementation;
winrt::UI_Host::implementation::App::App()
{
Initialize();
}
winrt::UI_Host::implementation::App::~App()
{
Close();
}
如果我将 .IDL 文件保留为:
namespace UI_Host{}
它编译得很好,但我不能在我的 Win32 程序中使用 App
class。所以我将 IDL 文件更改为:
namespace UI_Host
{
[default_interface]
runtimeclass App : Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication
{
App();
}
}
但现在无法编译。我在编译时得到的错误是:
>module.g.obj : error LNK2019: unresolved external symbol "void * __cdecl winrt_make_UI_Host_App(void)" (?winrt_make_UI_Host_App@@YAPEAXXZ) referenced in function "void * __cdecl winrt_get_activation_factory(class std::basic_string_view<wchar_t,struct std::char_traits<wchar_t> > const &)" (?winrt_get_activation_factory@@YAPEAXAEBV?$basic_string_view@_WU?$char_traits@_W@std@@@std@@@Z)
有人知道为什么吗?
C++/WinRT 2.0 引入了重大更改以支持 Optimized Components。它在将 -optimize
传递给 cppwinrt.exe 时使用。新项目默认启用此选项。
重大更改要求组件作者 #include
将生成的实现文件添加到实现该特定类型的编译单元中。在你的情况下,你需要 #include "App.g.cpp"
到 App.cpp (确保 #include
它在头文件 App.h).
要允许您的代码在有和没有 -optimize
标志的情况下进行编译,您可以有条件地包含 App.g.cpp:
#include "App.h"
#if __has_include("App.g.cpp")
# include "App.g.cpp"
#endif
为了易于理解的课程,您可以阅读 Raymond Chen 的博客条目 Why does my C++/WinRT project get errors of the form "Unresolved external symbol void* __cdecl winrt_make_YourNamespace_YourClass(void)
"?。
我正在尝试按照此处的教程进行操作:UWP Xaml Hosting API.
我在教程的一部分应该创建一个定义 XamlApplication
应用程序的空白应用程序。我在 header (.h) 中将其定义为:
#pragma once
#include "App.xaml.g.h"
namespace winrt::UI_Host::implementation
{
struct App : Microsoft::Toolkit::Win32::UI::XamlHost::XamlApplicationT<App>
{
App();
~App();
};
}
我的 .cpp 文件定义为:
#include "pch.h"
#include "App.h"
using namespace winrt;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Navigation;
using namespace UI_Host;
using namespace UI_Host::implementation;
winrt::UI_Host::implementation::App::App()
{
Initialize();
}
winrt::UI_Host::implementation::App::~App()
{
Close();
}
如果我将 .IDL 文件保留为:
namespace UI_Host{}
它编译得很好,但我不能在我的 Win32 程序中使用 App
class。所以我将 IDL 文件更改为:
namespace UI_Host
{
[default_interface]
runtimeclass App : Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication
{
App();
}
}
但现在无法编译。我在编译时得到的错误是:
>module.g.obj : error LNK2019: unresolved external symbol "void * __cdecl winrt_make_UI_Host_App(void)" (?winrt_make_UI_Host_App@@YAPEAXXZ) referenced in function "void * __cdecl winrt_get_activation_factory(class std::basic_string_view<wchar_t,struct std::char_traits<wchar_t> > const &)" (?winrt_get_activation_factory@@YAPEAXAEBV?$basic_string_view@_WU?$char_traits@_W@std@@@std@@@Z)
有人知道为什么吗?
C++/WinRT 2.0 引入了重大更改以支持 Optimized Components。它在将 -optimize
传递给 cppwinrt.exe 时使用。新项目默认启用此选项。
重大更改要求组件作者 #include
将生成的实现文件添加到实现该特定类型的编译单元中。在你的情况下,你需要 #include "App.g.cpp"
到 App.cpp (确保 #include
它在头文件 App.h).
要允许您的代码在有和没有 -optimize
标志的情况下进行编译,您可以有条件地包含 App.g.cpp:
#include "App.h"
#if __has_include("App.g.cpp")
# include "App.g.cpp"
#endif
为了易于理解的课程,您可以阅读 Raymond Chen 的博客条目 Why does my C++/WinRT project get errors of the form "Unresolved external symbol void* __cdecl winrt_make_YourNamespace_YourClass(void)
"?。