flutter windows重分发vc++环境配置

210 阅读2分钟

背景:flutter打包windows桌面应用自分发后,由于部分用户电脑未安装vc++环境,导致应用无法正常启动,查阅了flutter官方文档,描述的比较简略,所以还是针对这部分分享下个人的踩坑记录

如图:

img_v3_02mm_556c5a5e-e23d-4f68-8d66-c7539644062g.png

上述文件不足以分发和运行应用程序,因为目标(最终用户)计算机中还需要 Visual C++ 运行时库。

要确保所需库的可用性,您可以复制以下 Visual Studio .dll 文件:

  • msvcp140.dll
  • msvcp140_1.dll
  • msvcp140_2.dll
  • vcruntime140.dll
  • vcruntime140_1.dll

从以下路径(或根据您的 Visual Studio 版本的类似路径):

C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\VC\
Redist\MSVC\14.34.31931\x64\Microsoft.VC143.CRT\

并将其与其他 .dll 文件一起放在 Project Build Release 文件夹中。

方式一:手动copy

手动copy dlls至 Project Build Release 文件夹中。

方式二:通过插件库cmake引入dlls

img_v3_02mm_41fa8154-28ce-4f3d-85d4-c3d4f46ee31g.png

set(<project_name>_bundled_libraries
    "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/msvcp140_1.dll"
    "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/msvcp140_2.dll"
    "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/msvcp140.dll"
    "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/vcruntime140_1.dll"
    "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/vcruntime140.dll"
    PARENT_SCOPE
)

注:project_name需要替换为你的cMakeLists.txt中的实际项目名

方式三: 在主工程的windows/CMakeList.txt中引入dlls

# 在CMake中确保所有相关DLL都被包含
message("[test] 正在安装DLL文件... DESTINATION:${INSTALL_BUNDLE_LIB_DIR}")
install(FILES 
  "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/msvcp140_1.dll"
  "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/msvcp140_2.dll"
  "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/msvcp140.dll"
  "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/vcruntime140_1.dll"
  "${CMAKE_CURRENT_SOURCE_DIR}/../native/lib/windows_x64/vcruntime140.dll"
  DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
  COMPONENT Runtime
) 
注:记得把dlls也放到对应目录,CMAKE_CURRENT_SOURCE_DIR这个变量就是当前cmake文件的所在目录

方式四:将此dlls添加到 Windows 安装程序

将此dlls添加到 Windows 安装程序(例如 Inno Setup、WiX 等),这个也是flutter官方文档中提及的方式 具体需要配合所选这的widnows打包程序使用,下面以inno setup为例:

// setup.iss
[Files]
Source: "<your_dlls_dir>"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs comparetimestamp;

引用部分

  1. Windows 开发 |扑动 --- Windows development | Flutter
  2. 打包和分发 Flutter 桌面应用程序:开源和独立开发者缺失的指南 - 创建 Windows .exe 安装程序[第 2 部分共 3 部分] |作者 Flutter Gems |中等 --- Packaging and Distributing Flutter Desktop Apps : The Missing Guide for Open Source & Indie Developers — Creating Windows .exe installer [Part 2 of 3] | by Flutter Gems | Medium