使用 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 的位码错误的主要内容,如果未能解决你的问题,请参考以下文章