【发布时间】:2023-03-16 09:12:02
【问题描述】:
环境:XCode 7.0.1 模块:Objective-C 捆绑类型:框架
您好,我正在尝试创建一个框架来支持 armv7、armv7s、arm64、i386 和 x86_64。我正在使用聚合来制作胖库。在聚合脚本中,我正在运行两个 xcodebuild 命令 1. 用于 armv7、armv7s 和 arm64 以及 2. 用于 i386 和 x86_64 架构。另外,我在目标构建设置下设置了 Enable Bitcode=YES 和 Other C Flags=-fembed-bitcode。作为预防措施,我在 xcodebuild 命令中添加了 ENABLE_BITCODE=YES 和 OTHER_CFLAGS="-fembed-bitcode" 选项
我的xcode构建命令如下-
#Build The framework Target for iPhoneOS
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${AN_TARGET}"
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphoneos
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"
CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}" SYMROOT="${SYMROOT}"
ARCHS="armv7 armv7s arm64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION
#Build The framework Target for iPhoneSimulator
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${AN_TARGET}"
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphonesimulator
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"
CONFIGURATION_BUILD_DIR="${IPHONE_SIMULATOR_BUILD_DIR}" SYMROOT="${SYMROOT}"
ARCHS="i386 x86_64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION
运行上述两个命令后,我将这两个版本组合起来使用以下命令制作一个胖框架二进制文件
# create a fat Framework
lipo -create
"${IPHONE_DEVICE_BUILD_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}"
"${IPHONE_SIMULATOR_BUILD_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}" -
output "${FRAMEWORK_FOLDER}/${AN_END_USER_FRAMEWORK_NAME}"
我面临的问题是在创建 lipo 之后,我无法在启用位码的应用程序中使用它。运行otool -l framework_binary | grep -LLVM 后,我没有看到启用位码的标志或__LLVM。
Lipo 从胖二进制文件中删除位码。有没有办法在运行 lipo 命令时保留位码?
更正:根据 Nestor 的回复,我以 otool -l -arch armv7 framework_binary | grep LLVM 运行了 otool 命令,令我惊讶的是,我可以看到 segname __LLVM clang。但是,当我将相同的胖框架二进制文件集成到我的项目中时,它在模拟器上构建良好,但是在设备上运行时抛出以下错误 - ld:'MyBinary' 不包含位码。您必须在启用位码的情况下重建它(Xcode 设置 ENABLE_BITCODE),从供应商处获取更新的库,或禁用此目标的位码。对于架构 armv7
【问题讨论】:
-
不应该是
grep LLVM而不是grep -LLVM吗? -
这里有同样的问题。 *.a 在 lipo 之前包含位码,但不在之后。
-
您是否检查过 iphoneos 的二进制文件(即被 lipo 集成之前的设备)是否有位码?如果没有,则不是 lipo 删除了 bitcode 部分。