首页 文章

如何使用bitcode选项制作胖框架?

提问于
浏览
11

环境:XCode 7.0.1模块:Objective-C Bundle类型:框架

嗨,我正在尝试创建一个支持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之后,我无法在启用bitcode的应用程序中使用它 . 运行 otool -l framework_binary | grep -LLVM 后,我看不到bitcode启用标志或__LLVM .

Lipo从脂肪二进制中移除了bitcode . 有没有办法在运行lipo命令时保留bitcode?

更正:根据Nestor的回复,我运行otool命令为 otool -l -arch armv7 framework_binary | grep LLVM ,令我惊讶的是,我可以看到segname __LLVM clang . 但是,当我将相同的胖框架二进制文件集成到我的项目中时,它在模拟器上构建正常,但在设备上运行时会抛出以下错误 - ld:'MyBinary'不包含bitcode . 您必须在启用bitcode(Xcode设置ENABLE_BITCODE)的情况下重建它,从供应商处获取更新的库,或禁用此目标的bitcode . 对于架构armv7

4 回答

  • 0

    令人高兴的是,这只是 otool 报道的一个问题,而不是 lipo ;你必须添加 -arch 参数:

    otool -arch arm64 -l myLipoOutput.a
    

    资料来源:http://www.openradar.me/radar?id=6301306440384512

  • 1

    这很奇怪,没有太多文档可以做到这一点,最后我使用这个命令:

    xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${FRAMEWORK_NAME} ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode FRAMEWORK_SEARCH_PATHS="${FRAMEWORK_SEARCH_PARTH} ${SRCROOT}/**" -sdk ${SIMULATOR_SDK} -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${SIMULATOR_SDK} 2>&1
    
    xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${FRAMEWORK_NAME} -sdk ${DEVICE_SDK} ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode FRAMEWORK_SEARCH_PATHS="${FRAMEWORK_SEARCH_PARTH} ${SRCROOT}/**" -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${DEVICE_SDK} 2>&1
    

    将BITCODE_GENERATION_MODE = bitcode标志添加到xcodebuild命令

  • 6

    尝试使用存档作为手臂切片而不是构建

    xcodebuild -scheme "${SCHEME}" -workspace "${WORKSPACE}" -configuration "${CONFIGURATION}" -sdk iphoneos ARCHS="arm64 armv7 armv7s" CONFIGURATION_BUILD_DIR="${CONFIGURATION_BUILD_DIR}/arm" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=NO archive
    

    之后运行lipo合并模拟器和手臂 .

    然后运行 otool -arch arm64 -l myLipoOutput.a ,它应该工作 .

  • 6

    它看起来像是Xcode 7.0.1中的一个错误 . 我有同样的问题,并将Xcode降级到版本7修复它 .

    Update: 实际上它可能是Xcode 7中的一个在7.0.1中修复的错误 - this SO answer为我解决了这个问题 .

相关问题