ios - 如何使用 xcconfig 文件在不同平台的 XCFramework 中链接正确的框架

标签 ios xcode linker xcframework

情况
我刚刚迁移到最新的 XCode12.4,因此我已将所有依赖项预编译为 xcframeworks .现在我正在使用 xcconfig链接到其中一些框架。
我有一个应用程序,它使用了几个预编译的 xcframeworks .
这是一个共享文件Dependencies/Frameworks.xcconfig它提供了对所有依赖项的轻松访问,并且与预编译的依赖项位于同一存储库中。

/// Path into xcode specific builds
FRAMEWORKS_PATH_12_4 = Frameworks/XCode12.4
FRAMEWORKS_PATH_11_5 = Frameworks/XCode11.5 // old path, obsolete
FRAMEWORKS_PATH_10_3 = Frameworks/XCode10.3 // old path, obsolete

/// All firebase related frameworks
FIREBASE_FRAMEMWORKS = -framework FirebaseAnalytics -framework FirebaseCore -framework FirebaseCoreDiagnostics -framework FirebaseCrashlytics -framework FirebaseInstallations -framework GoogleAppMeasurement -framework GoogleDataTransport -framework GoogleUtilities -framework PromisesObjC -framework nanopb 

/// Summary of all Frameworks provided by this repo
ALL_FRAMEWORKS = -framework ZipArchive -framework Alamofire -framework RxSwift -framework RxCocoa -framework RxRelay -framework Snapkit -framework SVGKit -framework Lottie -framework AudioKit -framework NSLoggerSwift $(FIREBASE_FRAMEMWORKS)
现在我的应用程序中的框架链接到 2 个框架,它看起来像这样
/// Include the dependency repo definitions
#include "../Dependencies/Frameworks.xcconfig"

/// Define this for the carthage build step
DEPENDENCIES_PATH[config=RC]         = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)
DEPENDENCIES_PATH[config=Release]    = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)
DEPENDENCIES_PATH[config=T1]         = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)
DEPENDENCIES_PATH[config=Debug]      = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)

/// Setup search paths
FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEPENDENCIES_PATH)/**

/// Include required frameworks
OTHER_LDFLAGS = $(inherited) -framework Alamofire -framework ZipArchive
问题
现在,当我针对通用设备构建或存档时,一切都很好。但是当我为模拟器构建时,我得到了这个错误
Could not find module 'Alamofire' for target 'x86_64-apple-ios-simulator'; found: arm64, armv7-apple-ios, arm64-apple-ios, arm, armv7
我认为这是由于这里的递归搜索路径
/// Setup search paths
FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEPENDENCIES_PATH)/**
当我删除递归搜索路径时,出现此错误
No such module 'Alamofire'
解决方法
似乎可行的是告诉编译器深入查看 xcframework 内部。像这样
/// Setup search paths
FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*] = $(inherited) $(DEPENDENCIES_PATH)/Alamofire.xcframework/ios-arm64_armv7 $(inherited) $(DEPENDENCIES_PATH)/ZipArchive.xcframework/ios-arm64_armv7
FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*] = $(inherited) $(DEPENDENCIES_PATH)/Alamofire.xcframework/ios-arm64_i386_x86_64-simulator $(DEPENDENCIES_PATH)/ZipArchive.xcframework/ios-arm64_i386_x86_64-simulator
但老实说,我在项目中有几十个依赖项,维护它非常乏味。
问题
我如何告诉我的框架 xcconfig它应该看起来的文件里面 xcframework 中的正确架构文件夹找到实际的framework ?

最佳答案

在 Xcode 中,将 Run Script 预构建操作添加到您的方案中。
将此脚本放入 Run Script 预构建操作中:

OLD_DIR="${PWD}"
rm -rf "${CONFIGURATION_TEMP_DIR}/XCFrameworkSlices"
mkdir -p "${CONFIGURATION_TEMP_DIR}/XCFrameworkSlices"
cd "${CONFIGURATION_TEMP_DIR}/XCFrameworkSlices"
SUFFIX="arm[v6][74]"
if [[ ! -z "$LLVM_TARGET_TRIPLE_SUFFIX" ]]; then
   SUFFIX=$LLVM_TARGET_TRIPLE_SUFFIX
fi
find $DEPENDENCIES_PATH/*.xcframework/$SWIFT_PLATFORM_TARGET_PREFIX-*$SUFFIX -type d -depth 0 -print0 | xargs -0 -I {} sh -c 'ln -s "$1" "./$(basename $(dirname \"$1\"))"' - {}
cd "${OLD_DIR}"
在 xcconfig 中:
DEPENDENCIES_PATH_RC         = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)
DEPENDENCIES_PATH_Release    = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)
DEPENDENCIES_PATH_T1         = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)
DEPENDENCIES_PATH_Debug      = $(SRCROOT)/../Dependencies/$(FRAMEWORKS_PATH_12_4)

DEPENDENCIES_PATH = $(DEPENDENCIES_PATH_$(CONFIGURATION))
FRAMEWORK_SEARCH_PATHS = $(inherited) $CONFIGURATION_TEMP_DIR/XCFrameworkSlices/**

关于ios - 如何使用 xcconfig 文件在不同平台的 XCFramework 中链接正确的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66281886/

相关文章:

iphone - 锁定 UIDatePicker 列

ios - 使用键检索 PFObject

c++ - TinyXml++ 和 Visual C++ Express Edition 2008 的链接问题

c - 从 Leptonica 图像处理库执行代码示例

iphone - 如何获取iPhone中安装的应用程序名称列表

iPhone 应用架构

ios - 从 Presentmodelview 堆栈中移除 UIViewcontroller

Xcode 仪器 - 修复漏洞

c++ - 你能在不同的翻译单元中有两个同名和同一个成员函数的类吗?

iphone - 尝试将 NSUInteger 与枚举一起使用 (<<)