在启用位代码的情况下编译iOS库

在启用位代码的情况下编译iOS库,ios,frameworks,bitcode,Ios,Frameworks,Bitcode,我需要发布一个启用了位代码的框架,这是一个麻烦。我将项目设置中的“启用位代码”设置为“是”,它可以为真实设备和模拟器清晰地构建 我想测试这个库,所以我将它集成到一个新的应用程序中,我为此创建了一个新的应用程序,但现在它只为模拟器而构建。当我尝试为真正的设备构建时,我得到: ld: '/path/to/Framework.framework/Company(File.o)' does not contain bitcode. You must rebuild it with bitcode ena

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

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

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)
正如我所说,我是在启用位代码的情况下构建它的,所以我不知道为什么会发生这种情况


有什么想法吗?感谢您,当您使用Xcode构建应用程序时,它仅在您进行存档时才包含位代码,原因是-当您只想调试或测试应用程序/库时,可以减少编译时间

为了确保Xcode在每次构建时都会发出位代码,您可以将
-fembed bitcode
标志添加到
其他C标志和
其他链接器标志中:

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

otool-l二进制名称| grep uu LLVM


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

运行脚本代码的另一种方式:(构建设置--构建阶段运行脚本)

#定义输出文件夹环境变量
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-UNIVERSAL
#第一步。构建设备和模拟器版本
xcodebuild-targettargetname ONLY\u ACTIVE\u ARCH=NO-配置发布-sdk iphoneos BUILD\u DIR=“${BUILD\u DIR}”BUILD\u ROOT=“${BUILD\u ROOT}”
xcodebuild-targettargetname-configuration Release-sdk iphonesimulator BUILD_DIR=“${BUILD_DIR}”BUILD_ROOT=“${BUILD_ROOT}”
#确保输出目录存在
mkdir-p“${UNIVERSAL_OUTPUTFOLDER}”
#第二步。使用lipo创建通用二进制文件
lipo-create-output“${UNIVERSAL\u OUTPUTFOLDER}/lib${PROJECT\u NAME}.a”“${BUILD\u DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT\u NAME}.a”“${BUILD\u DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT\u NAME}.a”
#最后一击。复制头文件。只是为了方便

cp-R“${BUILD\u DIR}/${CONFIGURATION}-iphoneos/include”“${UNIVERSAL\u OUTPUTFOLDER}/”
用于使用必须添加的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}"

\uu LLVM
段的存在并不能证明位码也存在。还有其他具有该名称的段,这些段不包含位代码。更好的grep用于
\uu bitcode
。通用框架也需要这样做吗?我确实在主目标和“通用”目标中启用了位码,但当稍后在另一个应用程序中使用此框架时,由于该框架没有位码或如它所说的那样,该框架将失败。我添加了
-fembed位码
,正如您所建议的,这似乎也解决了框架的问题。我在使用自定义动态库时遇到了位代码问题。Grep显示uullvm存在。只有在我将
OTHER\u CFLAGS=“-fembed bitcode”
添加到我的通用框架构建脚本并更新嵌入的二进制文件后,最终的应用程序归档构建才成功。不过,otool在
segname\uu LLVM
中没有显示任何变化,甚至根本不存在
bitcode
。这些库具有位代码的唯一迹象是它们的大小从1MB以下增加到9MB。我使用的是类似的脚本,但它不能防止位代码问题。我必须添加
OTHER\u CFLAGS=“-fembed bitcode”
archive
命令,以阻止我的最终应用程序存档抱怨链接框架中缺少位代码。在我看来,向下投票根本无法解决主题(位代码)