我有我的自定义框架,并且可以在XCode 10中正常工作。我在XCode 11 beta 3中对其进行了重建,然后将其集成到应用程序中,并出现以下错误:
找不到目标“ x86_64-apple-ios-simulator”的模块“ MyCustomFramework”;找到:arm64,arm64-apple-ios
框架项目中的“有效架构”是否需要做一些更改?
答案 0 :(得分:13)
我添加了两个体系结构i386和x86_64。 并将“是”设置为“仅构建活动体系结构”。 我可以在所有模拟器设备上构建它。
对于XCode-12,有效架构已在最底部的用户定义选项下移动为VALID_ARCHS
答案 1 :(得分:8)
要解决此问题,我不得不再次使用xcode 11工具创建一个自定义框架的胖库。
为此,我执行了以下操作:
1)为iOS模拟器构建YourCustomFramework
目标,并从桌面上的products文件夹中提取框架。
Xcode▸DerivedData▸您的项目▸Build▸Products▸Release-iphonesimulator
2)为通用iOS设备构建YourCustomFramework
目标,并从桌面上的products文件夹中提取框架。
Xcode▸DerivedData▸您的项目▸Build▸Products▸Release-iphoneos
3),将模拟器生成的框架重命名为YourCustomFramework-sim.framework
,以便以后可以区分。
4)使用lipo命令将两个二进制文件合并为一个胖二进制文件。 (安装到桌面或自定义框架文件所在的任何位置)
$lipo -create ./YourCustomFramework-sim.framework/YourCustomFramework ./YourCustomFramework.framework/YourCustomFramework -output ./YourCustomFramework
5)复制上面步骤中创建的YourCustomFramework
二进制文件,并将其替换为YourCustomFramework.framework
文件夹中的二进制文件。
6)从文件夹
YourCustomFramework-sim.framework/Modules/YourCustomFramework.swiftmodule/
复制所有模块并将其粘贴到
YourCustomFramework.framework/Modules/YourCustomFramework.swiftmodule/
这应该可以解决您的问题。
答案 2 :(得分:8)
我在 M1 MacBook 上遇到了这个问题。
为了解决这个问题,我在我的主机应用程序 Podfile 中添加了以下几行:
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
end
end
end
编辑:添加此行也有助于解决运行时问题:
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
答案 3 :(得分:5)
Swift 5.0-5.1,Xcode 11
打开Xcode,<您的项目>,构建设置,仅构建Active Architecture,并更改为
有效体系结构:armv7,armv7s,amr64,amr64e,在此处添加x86_64,如果需要,请添加i386进行调试和发布。 (字符串:armv7,armv7s,amr64,amr64e,x86_64)
在您的模拟器列表和内置IT中选择任何模拟器。完成。
我希望它对您有用。
建筑说明:
armv64:iPhoneX,iPhone 5s-8,iPad Air-iPad Pro
armv7:iPhone3Gs-5c,iPad WIFI(第四代)
armv6:iPhone-iPhone3G
-如果用于真实设备,则为以上
i386:32位模拟器
x86_64:64位模拟器
答案 4 :(得分:3)
答案 5 :(得分:0)
请检查您的Scheme
,确保运行正确的方案。
然后,您应该打开XCode > -Your Main Target- >
“仅构建活动架构”,并为所有架构上的构建设置“否”。
选项:
是-如果设置为yes,则Xcode将检测连接的设备,确定体系结构,并仅在该体系结构上构建。
否-如果设置为no,则它将建立在所有体系结构上。
我希望这是可行的。
享受。
答案 6 :(得分:0)
我遇到了同样的问题。 Xcode10.2开始报告此错误。与框架合并的最新版本的xcode有哪些更改?相同的框架项目与xcode10.1一起运行,并且脚本将框架合并是没有问题的。
答案 7 :(得分:0)
如果要自动执行项目流程,可以尝试以下我在框架项目中使用的脚本。
它同时适用于 Objective-C 和 Swift 项目。
有关更新,请关注我的repo page。
#!/bin/sh
echo "\n ⏱ Starting the Universal Framework work \n\n\n"
exec > /tmp/${PROJECT_NAME}_archive.log 2>&1
FRAMEWORK_NAME="${PROJECT_NAME}"
DEVICE_LIBRARY_PATH=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework
SIMULATOR_LIBRARY_PATH=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework
UNIVERSAL_LIBRARY_DIR=${BUILD_DIR}/${CONFIGURATION}-Universal
ROW_STRING="\n##################################################################\n"
# Make sure the output directory exists
mkdir -p "${UNIVERSAL_LIBRARY_DIR}"
######################
# Step 1: Build Frameworks
######################
echo "${ROW_STRING}"
echo "\n\n\n ? Step 1: Building for iphonesimulator"
echo "${ROW_STRING}"
xcodebuild -workspace "${WORKSPACE_PATH}" -scheme "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" -UseModernBuildSystem=NO clean build
echo "${ROW_STRING}"
echo "\n\n\n ? Step 1: Building for iphoneos \n\n\n"
xcodebuild -workspace "${WORKSPACE_PATH}" -scheme "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" -UseModernBuildSystem=NO clean build
######################
# Step 2. Copy the frameworks
######################
echo "${ROW_STRING}"
echo "\n\n\n ? Step 2: Copy the framework structure for iphoneos"
echo "${ROW_STRING}"
cp -R "${DEVICE_LIBRARY_PATH}" "${UNIVERSAL_LIBRARY_DIR}/"
######################
# Step 3. Create the universal binary
######################
echo "${ROW_STRING}"
echo "\n\n\n ? Step 3: The LIPO Step"
echo "${ROW_STRING}"
lipo -create "${SIMULATOR_LIBRARY_PATH}/${PROJECT_NAME}" "${DEVICE_LIBRARY_PATH}/${PROJECT_NAME}" -output "${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework/${PROJECT_NAME}"
######################
# Step 4. Copy the Swiftmodules.
# ? This step is necessary only if your project is Swift. For the Swift framework, Swiftmodule needs to be copied in the universal framework.
######################
echo "${ROW_STRING}"
echo "\n\n\n ? Step 4: Copy the Swiftmodules"
echo "${ROW_STRING}"
if [ -d "${SIMULATOR_LIBRARY_PATH}/Modules/${PROJECT_NAME}.swiftmodule/" ]; then
cp -f ${SIMULATOR_LIBRARY_PATH}/Modules/${PROJECT_NAME}.swiftmodule/* "${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/" | echo
fi
if [ -d "${DEVICE_LIBRARY_PATH}/Modules/${PROJECT_NAME}.swiftmodule/" ]; then
cp -f ${DEVICE_LIBRARY_PATH}/Modules/${PROJECT_NAME}.swiftmodule/* "${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/" | echo
fi
######################
# Step 5. Remove the existing copy of the Universal framework and copy the framework to the project's directory
######################
echo "${ROW_STRING}"
echo "\n\n\n ? Step 5 Copying in the project directory"
echo "${ROW_STRING}"
rm -rf "${PROJECT_DIR}/${FRAMEWORK_NAME}.framework"
yes | cp -Rf "${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework" "${PROJECT_DIR}"
######################
# Step 6. Open the project's directory
######################
echo "${ROW_STRING}"
open "${PROJECT_DIR}"
echo "${ROW_STRING}"
######################
# Step 7. Open the log file on Console application
######################
echo "${ROW_STRING}"
open /tmp/${PROJECT_NAME}_archive.log
echo "${ROW_STRING}"
echo "\n\n\n ? For more details please check the /tmp/${PROJECT_NAME}_archive.log file. \n\n\n"
echo "\n\n\n ? Completed!"
最好。
答案 8 :(得分:0)
对我来说,这是一个缺少的设置。 在Xcode中,转到:文件->工作区设置。在“构建系统”中,将其更改为“旧版构建系统”。
再次运行并复制新的框架
答案 9 :(得分:0)
对于带有 Xcode 12 的新 M1 Mac,我遇到了同样的问题。我能够通过在构建设置中设置 Build Active Architecture Only = 'Yes'
并添加 VALID_ARCHS = arm64 armv7 arm64-ios-simulator
(基本上不包括 x86_64
和 x86_64-ios-simulator
架构)来解决它。
答案 10 :(得分:0)