Flutter桌面应用调用DLL报错:Failed to load dynamic library 求助
解决Flutter Windows加载DLL失败的问题
一、修正DLL路径问题
Flutter Windows应用调试/运行时的工作目录是项目根目录下的build\windows\runner\Debug(调试模式),你把DLL放在lib/library/windows/里,程序运行时根本找不到该文件。
解决方式:
- 直接将
randomnumber.dll移动到项目的windows\runner\目录下,Flutter编译时会自动将其复制到最终的Debug/Release运行目录; - 或者在代码中使用动态路径拼接(需导入
dart:io),确保指向正确的DLL位置:import 'dart:io'; import 'package:path/path.dart' as path; // ... String dllPath = path.join(Directory.current.path, 'randomnumber.dll'); final dyLib = DynamicLibrary.open(dllPath);
二、确保DLL是适配Windows的正确版本
- 必须编译x64架构的DLL:Flutter Windows默认编译x64程序,32位DLL无法被加载;
- 使用Windows平台编译器编译:比如MSVC、MinGW-w64,不能用Linux/macOS编译器交叉编译(除非明确指定x64目标架构);
- 验证DLL有效性:用Windows自带的
dumpbin工具查看导出函数,执行命令:
输出中能看到dumpbin /exports randomnumber.dllfetch_number才说明函数导出正常。
三、修复C函数的名字改编问题
C语言编译时会自动修改函数名(比如变为_fetch_number@0),导致Dart无法找到对应符号。需要在头文件中用extern "C"声明函数,避免名字改编:
修改randomnumber.h:
#ifdef __cplusplus extern "C" { #endif int fetch_number(); #ifdef __cplusplus } #endif
修改后重新编译DLL,函数名将保持fetch_number不变。
四、移除无用权限配置
你添加的Android/iOS权限对Windows桌面应用完全无效,直接删除以下配置:
AndroidManifest.xml中的存储权限声明;Info.plist中的相册权限描述。
五、检查DLL依赖库
如果你的DLL依赖第三方运行时库(比如MinGW的libgcc_s_seh-1.dll等),需要将这些依赖库一并放到应用运行目录下。可以用Dependency Walker工具查看DLL的依赖项,确保所有依赖文件都存在。
内容的提问来源于stack exchange,提问作者kavan gowda
相关产品推荐
相关产品推荐

