在 Cocoapod 中导入 Kotlin/Native 框架

Posted

技术标签:

【中文标题】在 Cocoapod 中导入 Kotlin/Native 框架【英文标题】:Import Kotlin/Native framework in Cocoapod 【发布时间】:2018-08-07 15:19:12 【问题描述】:

我正在尝试在私有 CocoaPod 中添加使用 Kotlin/Native 构建的供应商框架,但出现错误:

我已经使用 Kotlin/Native 生成​​了一个 ios 框架。 我将框架文件夹(由 Konan 编译/生成)复制到我的自定义 pod 文件夹中 在 podspec 中,我在“vendored_frameworks”列表中添加了框架路径 我启动pod repo push myCocoapodsRepo myProject.podspec --verbose" 我收到一个错误:

[iOS] xcodebuild: fatal error: lipo: input file (/Users/jeandaube/Library/Developer/Xcode/DerivedData/App-auugdpsmbbpvarfzghxatkvwftsn/Build/Products/Release-iphonesimulator/App.app/Frameworks/MyProject.framework/MyProject) must be a fat file when the -remove option is specified

我是否应该首先更改使用 Konan 导出框架的格式?

【问题讨论】:

【参考方案1】:

您收到错误是因为默认情况下,Kotlin Native 只为单一架构生成二进制文件。 CocoaPods 在尝试将其视为具有多种架构的“胖”二进制文件时会失败。因为无论如何你都需要多个架构(至少 arm64 用于设备,x86_64 用于模拟器),我使用的方法是创建两个架构,然后将它们与lipo 合并,然后可以通过 CocoaPods 出售生成的胖框架或者只是拖放安装在 Xcode 中。

def outputDirectory = "$export_dir/$projectName/$projectVersion"
def outputFramework = "$outputDirectory/$projectName.framework"

konanArtifacts 
    // Declare building into a framework, build arm64 for device, x64 for simulator                                                      
    framework(projectName, targets: ['ios_arm64', 'ios_x64' ]) 
        // The multiplatform support is disabled by default.                                   
        enableMultiplatform true
    


// combine original arm64 and x64 libraries into a single library in
// the exported framework folder
task combineArchitectures(type: Exec, dependsOn: compileKonanLibrary) 
    executable 'lipo'
    args = [
            '-create',
            '-arch',
            'arm64',
            new File(compileKonanLibraryIos_arm64.artifact, 'Library'),
            '-arch',
            'x86_64',
            new File(compileKonanLibraryIos_x64.artifact, 'Library'),
            '-output',
            "$outputFramework/Library"
    ]


// export the arm64 (doesn't matter which really) framework, skipping
// the library binary itself
task exportFramework(type: Copy, dependsOn: compileKonanLibrary) 
    from compileKonanLibraryIos_arm64.artifact
    into outputFramework
    exclude projectName
    finalizedBy combineArchitectures


// build a pod spec by copying and updating a template file
task exportPodspec(type: Copy) 
    from "Library.podspec"
    into outputDirectory
    filter 
        it.replaceAll('@@projectName@@', projectName)
            .replaceAll('@@projectVersion@@', projectVersion)
    


task export 
    dependsOn "exportFramework"
    dependsOn "exportPodspec"

【讨论】:

【参考方案2】:

Kotlin/Native 不会生成多架构(又名胖)二进制文件(请参阅 https://en.wikipedia.org/wiki/Fat_binary),因此尝试在它生成的框架上运行 lipo 是没有意义的。

【讨论】:

似乎可以在 KN 中启用多架构。 不适用于当前 1.3.30 EAP。

以上是关于在 Cocoapod 中导入 Kotlin/Native 框架的主要内容,如果未能解决你的问题,请参考以下文章

将 Objective-C 框架(CocoaPod)导入 Swift?

cocoapod使用日记

在 index.html 中导入 css 和在 Angular 5 中导入 styleUrls 的区别

在 NextJS 中导入 SVG

在 python 类中导入模块

如何在vue.js项目的main.js文件中导入js类并在所有组件中使用它而不是在每个组件中导入?