【问题标题】:Separate arm64 and x86_64 compiled frameworks in Xcode在 Xcode 中分离 arm64 和 x86_64 编译的框架
【发布时间】:2019-06-05 06:08:02
【问题描述】:

我使用 Kotlin/Native 为 arm64 和 x86_64 架构编译了 mylib.framework,并在常规选项卡中使用 Embedded Binaries 嵌入了 arm64 架构。在测试目标中,我使用 Link Binary With Libraries 引用 x86_64 框架。设备的存档和编译效果很好,但测试目标引用的编译过程是 arm64 框架。在测试目标的一般选项卡中,我没有 Embedded Binaries 部分。

我如何告诉 Xcode 使用 arm64 框架进行设备和存档构建以及测试目标使用 x86_64 框架?

【问题讨论】:

    标签: ios xcode kotlin-native


    【解决方案1】:

    首先(如果您还没有),您应该为 Kotlin-Native / Kotlin-Multiplatform 使用 gradle-plugin。您的目标的主要优势在于,通过正确的目标和依赖项,它可以为您提供大量任务,每项任务都恰好满足您的一个需求:

    $ sh -c ". ./gradlew tasks"
    ...
    compileDebugIos_arm64KotlinNative - Compiles Kotlin/Native source set 'main' into a framework
    compileDebugIos_x64KotlinNative - Compiles Kotlin/Native source set 'main' into a framework
    compileReleaseIos_arm64KotlinNative - Compiles Kotlin/Native source set 'main' into a framework
    compileReleaseIos_x64KotlinNative - Compiles Kotlin/Native source set 'main' into a framework
    


    然后,您在构建设置“用户定义部分”中为每个任务声明每个目标的不同值,如下所示:

    最后一步是向您的 Xcode-Project 添加一个构建阶段,该阶段通过动态使用合适的任务名称来编译 Kotlin 代码以满足给定上下文的需求:

    ...
    sh -c ". ./gradlew $KONAN_TASK"
    ...
    

    This tutorial (https://www.raywenderlich.com/7357-ios-app-with-kotlin-native-getting-started) 提供更多详细信息和示例代码。

    【讨论】:

      【解决方案2】:

      现在我在“构建阶段”选项卡中使用 Xcode 的“运行脚本”,并在网络上找到以下内容:

      APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
      # This script loops through the frameworks embedded in the application and
      # removes unused architectures.
      find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
      do
          FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
          FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
          echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
          EXTRACTED_ARCHS=()
          for ARCH in $ARCHS
          do
              echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
              lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
              EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
          done
          echo "Merging extracted architectures: ${ARCHS}"
          lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
          rm "${EXTRACTED_ARCHS[@]}"
          echo "Replacing original executable with thinned version"
          rm "$FRAMEWORK_EXECUTABLE_PATH"
          mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 2021-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多