0

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

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

4

2 回答 2

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"
...

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

于 2019-09-09T16:20:00.450 回答
0

现在我在“构建阶段”选项卡中使用 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
于 2020-02-04T14:31:59.650 回答