启用位码编译iOS库

14

我需要发布一个启用了位码(bitcode)的框架,但这却很麻烦。我在项目设置中将“启用位码(Enable Bitcode)”设置为“是(YES)”,并且它可以干净地构建出真实设备和模拟器的版本。

我想测试这个库,所以将其集成到一个新的应用程序中进行测试,但现在只能在模拟器上构建。当我尝试构建真实设备版本时,会出现以下错误:

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来构建它,所以我不确定为什么会发生这种情况。

有任何想法吗?谢谢

3个回答

27
据我所知,在使用Xcode构建应用程序时,只有在制作存档文件时才包含Bitcode,原因是为了在仅想要调试或测试应用程序/库时减少编译时间。
为确保Xcode在每次构建时都会发出bitcode,您可以将-fembed-bitcode标志添加到其他C标志其他链接器标志中: enter image description here enter image description here 此外,检查二进制文件是否包含bitcode的最简单方法是使用otoolgrepotool -l binary_name | grep __LLVM 如果有bitcode,则会看到一个或多个segname __LLVM条目,否则输出为空。

10
__LLVM 段的存在并不意味着 Bitcode 也存在。还有其他名为 __LLVM 的段,但它们不包含 Bitcode。最好用 __bitcode 进行 grep(搜索)。 - Mecki
这对于通用框架也是必需的吗?我在主目标和“通用”目标中都启用了位码,但是当稍后在另一个应用程序中使用此框架时,归档失败并抱怨该框架没有位码或者它说的那样。 - Jonny
我按照你的建议,只在主目标中添加了“-fembed-bitcode”,这似乎也解决了框架的问题。 - Jonny
在使用自定义动态库时,我遇到了位码问题。Grep 显示 __LLVM 存在。只有在我的通用框架构建脚本中添加 OTHER_CFLAGS="-fembed-bitcode" 并更新嵌入式二进制文件后,最终的应用程序归档构建才成功。然而,otool 没有显示 segname __LLVM 中的任何更改,而且根本没有出现 bitcode。唯一表明库具有位码的迹象是它们的大小从不到 1MB 增加到 9MB。 - JustAMartin

4

要使用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代码的另一种方法:(构建设置--构建阶段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}/"


1
我正在使用类似的脚本,但它不能防止位码问题。我不得不添加 OTHER_CFLAGS="-fembed-bitcode"archive 命令来阻止我的最终应用程序归档在链接的框架中抱怨缺少位码。 - JustAMartin
我认为这个回答没有以任何方式解决主题(位码),因此我会给它一个负面评价。 - superjos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接