Flutter Windows构建时如何将依赖的dll文件打包到产物中
Flutter Windows 构建自动纳入自定义FFI DLL 操作指南
第三方依赖的dll可以正常打包的核心原因是包内置了Windows构建阶段的文件复制规则,你可以通过以下两种方案实现相同效果:
方案1:修改Windows构建脚本(推荐FFI场景使用)
该方案会将dll直接输出到exe同级目录,不需要修改你现有FFI加载路径,开发和生产环境逻辑一致:
- 在项目根目录创建存储dll的文件夹,比如
native_libs/windows/,按照x64/x86架构分子目录存放对应的dll文件 - 打开项目路径下的
windows/CMakeLists.txt文件,找到以下代码行附近的位置:install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") - 在该行之前添加dll复制规则,示例如下:
# 配置自定义FFI DLL路径 if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64位系统dll路径 set(CUSTOM_FFI_DLL "${PROJECT_SOURCE_DIR}/../native_libs/windows/x64/my_custom.dll") else() # 32位系统dll路径 set(CUSTOM_FFI_DLL "${PROJECT_SOURCE_DIR}/../native_libs/windows/x86/my_custom.dll") endif() # 声明构建时复制dll到输出目录 install(FILES ${CUSTOM_FFI_DLL} DESTINATION "${CMAKE_INSTALL_BINDIR}") - 如果你有多个dll需要打包,重复添加
install(FILES ...)规则即可
方案2:通过pubspec声明资源
该方案会将dll打包到应用的flutter_assets目录下,需要同步修改FFI的加载路径指向assets内的dll:
- 在
pubspec.yaml的flutter节点下添加资源声明:flutter: assets: - native_libs/windows/x64/my_custom.dll - FFI加载时需要通过flutter的资源路径查找dll,示例加载代码:
final dllPath = join(await getApplicationSupportDirectory().path, 'data', 'flutter_assets', 'native_libs/windows/x64/my_custom.dll'); final dylib = DynamicLibrary.open(dllPath);
验证生效
执行flutter build windows或者msix构建命令后,查看构建产物目录,即可看到对应的dll已经被自动纳入,运行时不会再报找不到dll的错误。
内容的提问来源于stack exchange,提问作者xerotolerant
相关产品推荐
相关产品推荐

