WinRT DLL在UWP应用中使用VCPKG依赖时缺失DLL,如何解决?
确认cpr的UWP专属编译配置
使用VCPKG安装cpr时必须指定UWP平台的triplet,比如x64-uwp、x86-uwp或arm64-uwp。执行命令:vcpkg install cpr:x64-uwp,确保依赖是针对UWP环境编译的——桌面平台的cpr DLL无法在UWP中正常加载,这是导致缺失错误的核心原因之一。切换cpr为静态链接模式
把cpr设置为静态链接,避免依赖动态DLL。在VCPKG安装时可指定静态编译:vcpkg install cpr:x64-uwp --triplet x64-uwp(具体参数可参照cpr的VCPKG端口配置),静态链接会将cpr的代码直接打包进你的SDK,从根源上消除UWP运行时找不到DLL的问题。配置UWP项目的DLL复制规则
若必须使用动态链接,需确保cpr的UWP版DLL被复制到UWP应用的输出目录:- 在SDK项目的“生成事件”->“后期生成事件”中添加复制命令,比如:
copy "$(VCPKG_ROOT)\installed\x64-uwp\bin\cpr.dll" "$(TargetDir)" - 在UWP应用项目中,将SDK输出目录的cpr DLL添加为“内容”项,并设置“复制到输出目录”为“始终复制”
- 在SDK项目的“生成事件”->“后期生成事件”中添加复制命令,比如:
严格控制SDK的符号导出
检查SDK的导出宏设置,避免意外导出cpr的符号导致UWP加载器错误识别依赖。可在CMake配置中设置CMAKE_WINRT_EXPORT_ALL_SYMBOLS为OFF,手动标记需要导出的接口,减少不必要的依赖暴露。排查依赖链兼容性
用dumpbin /dependents工具检查SDK DLL和cpr DLL的依赖项,确认没有引用UWP不支持的系统库(如桌面版kernel32.dll的受限函数)。如果cpr存在这类不兼容依赖,可修改其编译选项启用UWP兼容模式,或替换为UWP原生网络库(如Windows.Web.Http)。
内容的提问来源于stack exchange,提问作者MicroDev

