【问题标题】: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