Я пытаюсь:
Короче говоря, мне очень трудно собрать мой примерный проект (с использованием моего плагина flutter ffi).
flutter_mimir.podspec в моих папках ios и macos: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' => '[email protected]' }
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/проекта моей библиотеки, чтобы разрешить сборку примера проекта?





Ответ на мой вопрос возник из этой ветки GitHub. Вот копия моего комментария:
На случай, если кто-то еще наткнется на это, я заставил FFI работать с моей кросс-платформенной XCFramework, используя ffiPlugin: true (спасибо @leisim за отличный пример с Isar!). Не могу поверить, что я этого не осознавал, но мой XCFramework трясло дерево. Вот как я это исправил (тот же код для macOS и iOS, но, к сожалению, не может быть символически связан):
my_package.podspecPod::Spec.new do |spec|
spec.name = 'my_package'
spec.version = '0.0.1'
spec.license = { :file => '../LICENSE' }
spec.homepage = ''
spec.authors = { 'Your Name' => '[email protected]' }
spec.summary = 'Some summary'
spec.source = { :path => '.' }
spec.source_files = 'Classes/**/*'
spec.public_header_files = 'Classes/**/*.h'
spec.vendored_frameworks = 'Frameworks/MyPackage.xcframework'
spec.ios.deployment_target = '11.0'
spec.osx.deployment_target = '10.11'
end
Classes/binding.hvoid enforce_binding();
Classes/EnforceBinding.swiftpublic func dummyMethodToEnforceBundling() {
enforce_binding() // disable tree shaking
}
Frameworks/MyPackage.xcframework должна иметь функцию void enforce_binding() {}. Я сделал это в Rust с помощью:/// Enforce the binding for this library (to prevent tree-shaking)
#[no_mangle]
pub extern "C" fn enforce_binding() {}