如何为macOS/iOS构建带XCFramework的Flutter Rust FFI插件?
问题与解决方案
概述
我正尝试:
- 使用
flutter_rust_bridge为Flutter创建FFI插件 - 在iOS/macOS平台使用XCFramework(目前相比通用库是更优选择)
简而言之,我在构建使用该Flutter FFI插件的示例项目时遇到了极大困难。
已完成操作
- 通过生成的Rust静态库创建了一个XCFramework(包含macOS、iOS和iOS模拟器静态库),这一步本身就颇费周折。
- 在
ios和macos目录中创建了如下flutter_mimir.podspec文件:
Pod::Spec.new do |spec| spec.name = 'flutter_mimir' spec.version = '0.0.1' spec.license = { :file => '../LICENSE' } spec.homepage = 'https://github.com/GregoryConrad/mimir' spec.authors = { 'Gregory Conrad' => 'gregorysconrad@gmail.com' } spec.summary = 'Embedded instance of milli' spec.ios.deployment_target = '9.0' spec.osx.deployment_target = '10.11' spec.source = { :path => '.' } spec.preserve_paths = 'EmbeddedMilli.xcframework/**/*' spec.vendored_frameworks = 'EmbeddedMilli.xcframework' spec.xcconfig = { 'OTHER_LDFLAGS' => '-framework EmbeddedMilli' } # TODO clean up following (not sure if these are actually needed here?) # Flutter.framework does not contain a i386 slice. spec.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } spec.static_framework = true end
- 将创建好的
EmbeddedMilli.xcframework移入ios和macos目录。 pod install执行正常。
问题
构建macOS项目时出现如下错误:
Launching lib/main.dart on macOS in debug mode... lib/main.dart:1 --- xcodebuild: WARNING: Using the first of multiple matching destinations: { platform:macOS, arch:arm64, id:00006000-0004695C0C06801E } { platform:macOS, arch:x86_64, id:00006000-0004695C0C06801E } ld: framework not found EmbeddedMilli clang: error: linker command failed with exit code 1 (use -v to see invocation)
请问如何修改库的podspec或项目构建设置,使示例项目能够成功构建?
解决方案
1. 修正podspec配置
- 移除冗余链接参数:使用
vendored_frameworks时CocoaPods会自动处理框架链接,删掉手动添加的OTHER_LDFLAGS配置:# 删掉这一行 spec.xcconfig = { 'OTHER_LDFLAGS' => '-framework EmbeddedMilli' } - 简化路径配置:将
preserve_paths改为直接指向XCFramework目录,无需通配符:spec.preserve_paths = 'EmbeddedMilli.xcframework' - 补充macOS架构排除规则:当前配置只针对iOS模拟器,添加macOS的架构排除,避免不兼容:
spec.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386', 'EXCLUDED_ARCHS[sdk=macosx*]' => 'i386' }
2. 验证XCFramework完整性
右键点击EmbeddedMilli.xcframework选择「显示包内容」,确认内部包含macos-arm64_x86_64(对应你的macOS架构)子目录,且目录下有完整的静态库(.a)和Info.plist文件。
3. 调整Xcode项目设置
- 打开macOS项目的Xcode工程,进入Build Settings,搜索
Framework Search Paths,添加XCFramework所在的相对路径(如$(PROJECT_DIR)/../ios),并设置为recursive。 - 检查Link Binary With Libraries中是否已包含
EmbeddedMilli.framework,若没有则手动添加。
4. 清理缓存重新构建
- 执行
pod deintegrate后重新pod install,清除CocoaPods缓存。 - 运行
flutter clean清除Flutter构建缓存,再执行flutter run -d macos重新构建。
内容的提问来源于stack exchange,提问作者Gregory Conrad
相关产品推荐
相关产品推荐

