最近我们更新了WindowsAppSDK 至stable-2.5.1 版本,同时也为microsoft-ui-xaml 仓库创建了最新的2.5.1 版本的tag。当然有不少开发者与我联系表示他们在使用这个最新的tag 进行OSS 构建时遇到了问题。具体问题如下:
Microsoft.UI.Xaml.Internal2.lib(InputHelpers.obj) : error LNK2019: unresolved external symbol "int cdecl GetModuleHandleExWAbs(unsigned long,wchar_t const *,struct HINSTANCE * *)" (?GetModuleHandleExWAbs@@YAHKPEB_WPEAPEAUHINSTANCE__@@@Z) referenced in function "public: long __cdecl InputHelpers:: PointerPointHelper::CreateSimulatedNonClientPointerPoint(struct ABI::Windows::Foundation:: Point,bool,bool,struct ABI::Microsoft::UI::WindowId,struct ABI::Microsoft::UI::Input::IPointerPoint * *)" (?CreateSimulatedNonClientPointerPoint@PointerPointHelper@InputHelpers@@QEAAJUPoint@Foundation@Windows@ABI@@_N1UWindowId@UI@Microsoft@6@PEAPEAUIPointerPoint@Input@896@@Z) [Microsoft.ui.xaml.vcxproj]
Microsoft.UI.Xaml.Animation.lib(TimeManager.obj) : error LNK2019: unresolved external symbol "public: long __cdecl CompositionAnimationHelper::ConnectAnimation(struct ABI::Microsoft::UI::Composition::ICompositionObject *,unsigned short const *,struct ABI::Microsoft::UI::Composition::ICompositionAnimation *,struct ICompositionAnimationController * *)" (?ConnectAnimation@CompositionAnimationHelper@@QEAAJPEAUICompositionObject@Composition@UI@Microsoft@ABI@@PEBGPEAUICompositionAnimation@3456@PEAPEAUICompositionAnimationController@@@Z) referenced in function "public: static void __cdecl CTimeManager::StartWUCAnimation(struct ABI::Microsoft::UI::Composition::ICompositor *,struct ABI::Microsoft::UI::Composition::ICompositionObject *,unsigned short const *,struct ABI::Microsoft::UI::Composition::ICompositionAnimation *,class CDependencyObject *,enum KnownPropertyIndex,class CTimeManager *)" (?StartWUCAnimation@CTimeManager@@SAXPEAUICompositor@Composition@UI@Microsoft@ABI@@PEAUICompositionObject@3456@PEBGPEAUIComposit
Microsoft.ui.xaml.dll : fatal error LNK1120: 2 unresolved externals [Microsoft.ui.xaml.vcxproj]
在OSS 构建时会输出这两个产出库的ABI 不兼容问题,这发生在C++ Link (链接)阶段。导致此问题的原因是我们最新的Microsoft.Internal.WinUIDetails 内部包使用"/Zc:wchar_t"选项编译,这与Microsoft.ui.xaml 所产出和链接的静态库所使用的"/Zc:wchar_t-"编译选项不一致。这部分组件库在范围内启用了Windows 运行时扩展支持即C++/CX,不使用标准的wchar_t 类型,导致了ABI 兼容性问题。我们在发布tag 2.5.1 时因为仓库内部构建使用的是不同版本的私有包而没有进行OSS 外部构建测试导致了这个疏忽。
因此对于OSS 构建遇到的问题,针对性的暂时修复代码并没有包含进入此tag 发布时提交的最新代码中。如果你需要正确构建tag 2.5.1版本的Microsoft.ui.xaml 库,你需要手动同步由Harshit 发起的 PR #11827
(Commit e147747) 中修改的两处代码分别位于“dxaml/xcp/components/animation/TimeManager.cpp” 和“dxaml/xcp/components/base/LoadLibraryAbs.cpp” 中,通过linker-shim alternatename 替换了静态库的符号以暂时缓解ABI 不兼容问题来确保通过构建。当然在OSS 构建时需要在Harshit 修改的基础上交换源符号和目标符号(我已跟他讨论过此问题)以通过链接。当然你也可以等待我们下一次发布新的tag,如此你无需手动修改代码,因为后续发布时会包含最新的修复。
以下是正确的修复代码,如果你正在尝试构建这个版本,可以手动添加他们到各自的源文件中:
LoadLibraryAbs.cpp
# if defined(_M_X64) || defined(_M_ARM64EC) || defined(_M_ARM64)
# pragma comment(linker, "/alternatename:?GetModuleHandleExWAbs@@YAHKPEB_WPEAPEAUHINSTANCE__@@@Z=?GetModuleHandleExWAbs@@YAHKPEBGPEAPEAUHINSTANCE__@@@Z")
#
# if defined(_M_ARM64EC)
# pragma comment(linker, "/alternatename:?GetModuleHandleExWAbs@@$$hYAHKPEB_WPEAPEAUHINSTANCE__@@@Z=?GetModuleHandleExWAbs@@$$hYAHKPEBGPEAPEAUHINSTANCE__@@@Z")
# endif
#
# elif defined(_M_IX86)
# pragma comment(linker, "/alternatename:?GetModuleHandleExWAbs@@YGHKPB_WPAPAUHINSTANCE__@@@Z=?GetModuleHandleExWAbs@@YGHKPBGPAPAUHINSTANCE__@@@Z")
# endif
TimeManager.cpp
# if defined(_M_X64) || defined(_M_ARM64EC) || defined(_M_ARM64)
# pragma comment(linker, "/alternatename:?ConnectAnimation@CompositionAnimationHelper@@QEAAJPEAUICompositionObject@Composition@UI@Microsoft@ABI@@PEBGPEAUICompositionAnimation@3456@PEAPEAUICompositionAnimationController@@@Z=?ConnectAnimation@CompositionAnimationHelper@@QEAAJPEAUICompositionObject@Composition@UI@Microsoft@ABI@@PEB_WPEAUICompositionAnimation@3456@PEAPEAUICompositionAnimationController@@@Z")
#
# if defined(_M_ARM64EC)
# pragma comment(linker, "/alternatename:?ConnectAnimation@CompositionAnimationHelper@@$$hQEAAJPEAUICompositionObject@Composition@UI@Microsoft@ABI@@PEBGPEAUICompositionAnimation@3456@PEAPEAUICompositionAnimationController@@@Z=?ConnectAnimation@CompositionAnimationHelper@@$$hQEAAJPEAUICompositionObject@Composition@UI@Microsoft@ABI@@PEB_WPEAUICompositionAnimation@3456@PEAPEAUICompositionAnimationController@@@Z")
# endif
#
# elif defined(_M_IX86)
# pragma comment(linker, "/alternatename:?ConnectAnimation@CompositionAnimationHelper@@QAEJPAUICompositionObject@Composition@UI@Microsoft@ABI@@PBGPAUICompositionAnimation@3456@PAPAUICompositionAnimationController@@@Z=?ConnectAnimation@CompositionAnimationHelper@@QAEJPAUICompositionObject@Composition@UI@Microsoft@ABI@@PB_WPAUICompositionAnimation@3456@PAPAUICompositionAnimationController@@@Z")
# endif
如果你还遇到了一些其他的问题,欢迎向我致电!