WinUI3静态库与其他目标并行编译失败问题求助
WinUI3静态库并行编译时缺失WinRT头文件的解决办法
我在开发WinUI3 Windows应用时遇到了一个问题:创建的包含WinUI3代码的静态库WinUI3Lib,单独编译或者和普通库RegularLib顺序编译都正常,但开启BUILD_PARALLEL=ON并行编译时,WinUI3Lib直接编译失败。
排查后发现,并行编译时WinUI3Lib根本没执行项目还原操作,导致构建目录下没生成必需的winrt/Microsoft.UI.Xaml.Controls.h头文件,触发了C1083编译错误。我按照微软官方文档配置了MSBuild多目标并行编译,但问题还是没解决。
复现步骤
- 把
TWHome环境变量设为Workspace的父目录(比如Workspace在D:\TW\Workspace,就把TWHome设成D:\TW) - 解压Workspace.zip,确保
CMakeLists.txt路径是\Workspace\CMakeLists.txt - 运行以下命令:
cd \Workspace cmake --preset=Windows-x64 cmake -DTW_BUILD_TYPE=Build -DTW_BUILD_PRESET=Windows-x64-Debug -DBUILD_PARALLEL=ON -P D:\TW\Workspace\TWBuild.cmake -- WinUI3Lib RegularLib
可行的解决方案
1. 给WinUI3库强制加还原前置依赖
在WinUI3Lib对应的CMake配置里,明确把NuGet还原任务设为编译前必须执行的步骤,确保并行编译时先搞定还原再编译:
add_library(WinUI3Lib STATIC ...) if(MSVC AND BUILD_PARALLEL) find_program(NUGET_EXE nuget) if(NUGET_EXE) add_custom_command(TARGET WinUI3Lib PRE_BUILD COMMAND ${NUGET_EXE} restore ${PROJECT_SOURCE_DIR}/WinUI3Lib/WinUI3Lib.csproj -SolutionDirectory ${PROJECT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Restoring NuGet packages for WinUI3Lib" ) endif() endif()
2. 调整MSBuild并行任务的依赖顺序
在TWBuild.cmake里,把WinUI3Lib的还原任务设为全局前置目标,保证并行编译启动前先完成所有WinUI3相关的还原操作:
if(BUILD_PARALLEL) add_custom_target(WinUI3LibRestore COMMAND nuget restore ${CMAKE_SOURCE_DIR}/WinUI3Lib/WinUI3Lib.csproj -SolutionDirectory ${CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) add_dependencies(WinUI3Lib WinUI3LibRestore) # 限制编译池数量避免资源冲突 set_property(GLOBAL PROPERTY JOB_POOLS compile_pool=4) set_property(TARGET WinUI3LibRestore PROPERTY JOB_POOL_COMPILE compile_pool) endif()
3. 检查CMake预设的还原配置
确保Windows-x64预设里包含了NuGet还原的相关配置,修改CMakePresets.json:
{ "name": "Windows-x64", "binaryDir": "${sourceDir}/build/${name}", "cacheVariables": { "CMAKE_CXX_COMPILER": "cl.exe", "CMAKE_SYSTEM_NAME": "Windows", "CMAKE_SYSTEM_VERSION": "10.0" }, "configurePreset": { "command": "cmake", "args": [ "-S", "${sourceDir}", "-B", "${binaryDir}", "-DCMAKE_BUILD_TYPE=Debug", "-DNUGET_RESTORE=ON" ] } }
验证方式
重新跑编译命令,去WinUI3Lib的构建目录里看看有没有生成winrt/Microsoft.UI.Xaml.Controls.h文件,确认并行编译时还原任务确实执行了。
内容的提问来源于stack exchange,提问作者user3409976
相关产品推荐
相关产品推荐

