【问题标题】:Compiling iOS library with bitcode enabled在启用位码的情况下编译 iOS 库
【发布时间】:2015-09-30 14:09:16
【问题描述】:

我需要发布一个启用了位码的框架,这很麻烦。我将项目设置中的“启用位码”设置为“是”,它可以为真实设备和模拟器构建干净。

我想测试这个库,所以我将它集成到我为此目的创建的一个新应用程序中,但现在它只为模拟器构建。当我尝试为真实设备构建时,我得到:

ld: '/path/to/Framework.framework/Company(File.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

就像我说的,我是在启用 Bitcode 的情况下构建的,所以我不确定为什么会发生这种情况。

有什么想法吗?谢谢

【问题讨论】:

    标签: ios frameworks bitcode


    【解决方案1】:

    AFAIK,当您使用 Xcode 构建应用程序时,它仅在您制作存档时才包含 Bitcode,原因 - 当只想调试或测试应用程序/库时减少编译时间。

    为确保 Xcode 在每次构建时发出位码,您可以将 -fembed-bitcode 标志添加到 Other C flagsOther linker flags

    此外,检查二进制文件是否包含位码的最简单方法是使用otoolgrep

    otool -l binary_name | grep __LLVM

    如果有位码,您将看到一个或多个segname __LLVM 条目,如果没有,您将看到空输出。

    【讨论】:

    • __LLVM 段的存在并不能证明 Bitcode 也存在。还有其他具有该名称的段,这些段不包含位码。 __bitcode 更好的 grep。
    • 通用框架也需要这样做吗?我确实在主目标和“通用”目标中启用了位码,但是稍后在另一个应用程序中使用此框架时,归档抱怨时失败,因为该框架没有位码左右说。
    • 我添加了-fembed-bitcode,就像你建议的那样,只添加到主要目标中,这似乎也为框架修复了它。
    • 我在使用自定义动态库时遇到了位码问题。 Grep 表明存在 __LLVM。只有在我将OTHER_CFLAGS="-fembed-bitcode" 添加到我的通用框架构建脚本并更新了嵌入式二进制文件之后,最终的应用程序存档构建才成功。尽管如此,otool 并没有显示segname __LLVM 的任何变化,而bitcode 甚至根本不存在。库具有位码的唯一迹象是它们的大小从不到 1MB 增加到 9MB。
    【解决方案2】:

    要使用 xcodebuild 命令启用位码,您必须添加

    BITCODE_GENERATION_MODE=bitcode.
    

    找到下面的命令

    xcodebuild BITCODE_GENERATION_MODE=bitcode -target TARGETNAME ONLY_ACTIVE_ARCH=NO -configuration Release -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
    

    【讨论】:

      【解决方案3】:

      RunScript 代码的另一种方式:(构建设置 -- Build Phases RunScript)

      # define output folder environment variable
      UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
      
      # Step 1. Build Device and Simulator versions
      xcodebuild -target TARGETNAME ONLY_ACTIVE_ARCH=NO -configuration Release -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
      xcodebuild -target TARGETNAME -configuration Release -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
      
      # make sure the output directory exists
      mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
      
      # Step 2. Create universal binary file using lipo
      lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"
      
      # Last touch. copy the header files. Just for convenience
      cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"

      【讨论】:

      • 我正在使用类似的脚本,但它不能防止位码问题。我必须添加 OTHER_CFLAGS="-fembed-bitcode"archive 命令来阻止我的最终应用存档抱怨链接框架中缺少位码。
      • 投反对票,因为在我看来,答案并没有以任何方式解决该主题(位码)
      猜你喜欢
      • 2019-05-29
      • 2019-08-14
      • 2020-12-05
      • 2018-04-28
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      相关资源
      最近更新 更多