You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为macOS/iOS构建带XCFramework的Flutter Rust FFI插件?

问题与解决方案

概述

我正尝试:

  • 使用flutter_rust_bridge为Flutter创建FFI插件
  • 在iOS/macOS平台使用XCFramework(目前相比通用库是更优选择)

简而言之,我在构建使用该Flutter FFI插件的示例项目时遇到了极大困难。

已完成操作

  1. 通过生成的Rust静态库创建了一个XCFramework(包含macOS、iOS和iOS模拟器静态库),这一步本身就颇费周折。
  2. 在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
  1. 将创建好的EmbeddedMilli.xcframework移入ios和macos目录。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:25:23