使用 xcodebuild 打包 ipa 的位码错误

Posted

技术标签:

【中文标题】使用 xcodebuild 打包 ipa 的位码错误【英文标题】:Bitcode error packaging ipa using xcodebuild 【发布时间】:2017-09-09 08:43:04 【问题描述】:

首先,我想说的是,如果没有 bitcode ,一切正常。当我在应用中打开“bitcode”标志时,问题就开始了。

此外,所有构建都是通过 CI 流程(不是在 xcode->archive et.al 中手动)。

框架是在与应用程序本身分开的流程中构建的(应用程序嵌入已编译的框架)

我在尝试打包 ipa 时遇到此错误:

❌ ld:无法生成位码包,因为 '..../Framework.framework/Framework' 是在没有完整位码的情况下构建的。 所有用于 bitcode 的框架和 dylib 都必须从 Xcode 生成 归档或安装架构 armv7 的构建

❌ clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看 调用)

关于框架:

我正在使用以下命令构建框架:(省略技术细节)

# iphone (arm)
xcodebuild -configuration Release -sdk iphoneos CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

# iphone (simulator)
xcodebuild -configuration Release -sdk iphonesimulator CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

然后是 lipo(FAT 二进制)

lipo -create /Release-iphonesimulator/Framework.framework/Framework -output /Universal/Framework.framework/Framework

我已将编译器标志添加到框架中以“嵌入位码”

而且我什至“验证”了它具有其他 S.O. 的位码。问题:(Compiling ios library with bitcode enabled)

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

otool -l 二进制名称 | grep __LLVM

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

otool -arch arm64 -l Frameworks/Framework.framework/Framework  | grep __LL
segname __LLVM
segname __LLVM

我还尝试了添加编译标志的其他变体

xcodebuild OTHER_CFLAGS="-fembed-bitcode"

并向我报告了相同的错误

【问题讨论】:

我想知道您是否能够解决这个问题?我也有同样的问题。我跑了otool -arch armv7 -arch armv7s -arch arm64 -l Framework.framework/Framework | grep 'LLVM\|bitcode',然后返回 6 LLVM。但是当我尝试存档时,它因“clang: error: linker command failed with exit code 1”而失败。 在您提供的链接中答案的一个 cmets 中,用户 Mecki 表示在检查 otool 的输出时,__bitcode__LLVM 更能指示正确的位码编译。您或 OP 能否检查您的编译日志并查看 -fembed-bitcode 标志是否实际被传递? 进一步说明:在同一个 cmets 中,用户 Jonny 表示他只将 -fembed-bitcode 编译器标志添加到主目标,没有添加到任何嵌入式框架本身,并且成功了。 @fullofsquirrels 感谢您回答问题。这是我传递fembed-bitcode 的通用构建脚本: xcodebuild -project $NAME.xcodeproj -scheme $NAME -configuration 'Release' -sdk iphoneos enable_bitcode=yes -arch arm64 -arch armv7 -arch armv7s only_active_arch =yes OTHER_CFLAGS='-fembed-bitcode' 干净构建 |三通 iphoneos.log | xcpretty xcodebuild -project $NAME.xcodeproj -scheme $NAME -configuration 'Release' -sdk iphonesimulator10.3 -arch x86_64 -arch i386 only_active_arch=no OTHER_CFLAGS='-fembed-bitcode' clean build |三通 iphonesimulator.log |漂亮的 xcrun lipo -create -output $DIR/$NAME.framework/$NAME Build/Products/Release-iphoneos/$NAME.framework/$NAME Build/Products /Release-iphonesimulator/$NAME.framework/$NAME 【参考方案1】:

在目标的构建设置中添加 BITCODE_GENERATION_MODE=bitcode 作为用户定义的设置。

【讨论】:

以上是关于使用 xcodebuild 打包 ipa 的位码错误的主要内容,如果未能解决你的问题,请参考以下文章

xcodebuild和xcrun自动化编译ipa包 笔记

命令行工具打包

iOS:无效的位码版本

LLVM 对函数参数的位码错误检测

xcodebuild 命令无法生成 iPA

使用 XCodebuild 和 shell 脚本导出 IPA