【问题标题】:How do i make fat framework with bitcode option?如何使用位码选项制作胖框架?
【发布时间】: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 部分。

标签: ios xcode bitcode


【解决方案1】:

很高兴这只是otool 的报告问题,而不是lipo;您必须添加-arch 参数:

otool -arch arm64 -l myLipoOutput.a

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

【讨论】:

  • 试过了。不幸的是,胖二进制文件似乎不包含位码标志。当我在模拟器上运行它时,它构建得很好,但是当我在应用程序目标构建设置下使用 Enable Bitcode=YES 为设备构建它时,我收到错误 ld:'myBinary' 不包含位码。您必须在启用位码的情况下重建它(Xcode 设置 ENABLE_BITCODE),从供应商处获取更新的库,或禁用此目标的位码。
  • 很抱歉听到这个消息。你确定是脂肪去除了它?
  • 我认为,这里的问题有点不同。当我使用 -arch armv7 和 armv7s、arm64 运行命令 otool 时,我得到 segname __LLVM,但是当我使用位码胖二进制文件为设备构建应用程序时,我收到以下错误 ld:“MyBinary”不包含位码。您必须在启用位码的情况下重建它(Xcode 设置 ENABLE_BITCODE),从供应商处获取更新的库,或禁用此目标的位码。对于架构 armv7
【解决方案2】:

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

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 命令

【讨论】:

  • 这如何解决lipo 问题? lipo 在合并时剥离任何位码。
  • 最后我使用当前命令解决了这个问题: xcodebuild -project ${PROJECT_NAME}.xcodeproj ONLY_ACTIVE_ARCH=NO ENABLE_BITCODE=YES BITCODE_GENERATION_MODE=bitcode -sdk ${SIMULATOR_SDK} -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${SIMULATOR_SDK} 2>&1 xcodebuild -project ${PROJECT_NAME}.xcodeproj -sdk ${DEVICE_SDK} ONLY_ACTIVE_ARCH=NO ENABLE_BITCODE=YES BITCODE_GENERATION_MODE=bitcode -configuration ${CONFIGURATION } 清理构建 CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${DEVICE_SDK} 2>&1
  • 如果你做一个框架,即使你有一个支持位码的方案,我发现必须添加 BITCODE_GENERATION_MODE=bitcode。我找了 2 天才找到这个答案。
【解决方案3】:

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

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 来合并模拟器和 arm 的。

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

【讨论】:

    【解决方案4】:

    它看起来像 Xcode 7.0.1 中的一个错误。我遇到了同样的问题,将 Xcode 降级到版本 7 解决了它。

    更新: 实际上,这可能是 Xcode 7 中的一个错误,已在 7.0.1 中修复 - this SO answer 为我解决了这个问题。

    【讨论】:

    • 谢谢@silyevsk,会试一试。
    • @DeepakBadiger - 看起来stackoverflow.com/a/31346742/390928 为我解决了这个问题
    • 谢谢@silyevsk。已经关注了该 URL,但没有成功。另外,我应该使用什么 $Action 来使其工作,因为它说它只会为存档/生产构建创建位码?
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2016-07-12
    • 2016-12-29
    • 2021-01-23
    相关资源
    最近更新 更多