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

Dee*_*ger 12 xcode ios bitcode

环境: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
Run Code Online (Sandbox Code Playgroud)

在运行上面两个命令之后,我将这两个构建组合在一起,使用下面的命令创建一个胖框架二进制文件

# 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}"
Run Code Online (Sandbox Code Playgroud)

我面临的问题是在创建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

Dav*_*tes 8

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 如何解决“ lipo”问题?lipo将在合并时剥离任何位码。 (2认同)

Nes*_*tor 6

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

otool -arch arm64 -l myLipoOutput.a
Run Code Online (Sandbox Code Playgroud)

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