我如何使用 xcode 构建启用了 Bitcode 的静态库?
How do I xcodebuild a static library with Bitcode enabled?
Xcode 7 介绍了 Bitcode,这是某种 LLVM 中间二进制文件,这意味着 Apple 的服务器可以针对不同的体系结构重新编译我的应用程序,而无需我的参与。
在 Lookback,我在我们的图书馆中分发了一个静态存档框架。似乎当您使用 "Build & Archive" 以外的任何东西构建时,位码实际上并没有发送到我的库中,任何在他们的应用程序中链接到我的库并尝试在启用位码的情况下进行构建和存档的人都会得到其中之一两个警告:
ld: 'Lookback(Lookback.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.
(如果 lib 是用 Xcode 6 构建的)
ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE)
(如果 lib 是使用 Xcode 7 使用普通 xcodebuild 构建的)
我有一个构建设备+模拟器通用二进制文件的构建脚本,所以我不能使用构建和存档,而是从我的脚本的命令行 运行 xcodebuild
。如何让 xcodebuild
生成正确的启用位码的库?
Bitcode 是编译时特性(不是 link 时特性),这意味着每个 .o 文件在使用 bitcode 构建时都应包含一个名为 __bitcode 的额外部分。您可以通过 运行 otool -l (my .o or .a file) | grep __LLVM
.
确认您的二进制文件是否与位码兼容
正常构建时,Xcode 将构建标志 -fembed-bitcode-marker
添加到任何 clang 调用。这似乎是某种 'this is where bitcode would go, if bitcode was enabled' 的东西,实际上并没有启用位码。
当你 "Build & Archive" 时,这个标志被 -fembed-bitcode
取代,这确实构建了一个启用 Bitcode 的二进制文件。
似乎有两种方法可以使 xcodebuild
使用 -fembed-bitcode
:
- 使用 'archive' 操作,如
xcodebuild -target LookbackSDK archive
而不是 xcodebuild -target LookbackSDK build
。这有将二进制文件放在 Xcode 管理器而不是 build/
文件夹中的副作用,尽管您可以使用 -exportArchive -archivePath ./build
解决这个问题(感谢 @JensAyton)
- 通过添加带有
OTHER_CFLAGS="-fembed-bitcode"
的其他 C 标志来强制使用该标志。您的 xcodebuild
调用看起来像 xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
.
后者是我选择的,这样我就不必更改我的构建系统,但它会为每个文件生成警告,因为现在 -fembed-bitcode-marker
和 -fembed-bitcode
都被发送到铛。幸运的是后者获胜,生成了一个支持 Bitcode 的库!
资源
一旦您为静态库添加了位码支持,它将与 Xcode 不兼容 6. 应用程序不会存档。
我想清楚地提到位码的设置,因为@nevyn 的回答让我有点困惑。
转到构建设置,搜索 "custom compiler flags"。添加-fembed-bitcode
。这将使用位码构建您的库。
使用 Xcode 8,我无法让 OTHER_CFLAGS="-fembed-bitcode"
工作。当我尝试创建包含我的静态框架的应用程序的存档构建时,我将 运行 保留为 was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
的内容。
我真正要找的是这个:
BITCODE_GENERATION_MODE=bitcode
我实际上在聚合目标中使用了一个 运行 脚本,完整的 xcodebuild 行看起来像这样(仅供参考):
xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
Select 项目
在 Build Settings -> Other C flags 上,将 Debug 设置为 -fembed-bitcode-marker 并将 Release 设置为 -fembed-bitcode
在 Build Settings 中,点击顶部的 + 号以添加名称为 BITCODE_GENERATION_MODE 的用户自定义构建设置,并将 Debug 设置为 marker,将 Release 设置为 bitcode
将架构编辑为发布
然后单击所需的库。一个文件并获取构建路径。
获取库表单 Release 文件夹。
Xcode 7 介绍了 Bitcode,这是某种 LLVM 中间二进制文件,这意味着 Apple 的服务器可以针对不同的体系结构重新编译我的应用程序,而无需我的参与。
在 Lookback,我在我们的图书馆中分发了一个静态存档框架。似乎当您使用 "Build & Archive" 以外的任何东西构建时,位码实际上并没有发送到我的库中,任何在他们的应用程序中链接到我的库并尝试在启用位码的情况下进行构建和存档的人都会得到其中之一两个警告:
ld: 'Lookback(Lookback.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.
(如果 lib 是用 Xcode 6 构建的)ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE)
(如果 lib 是使用 Xcode 7 使用普通 xcodebuild 构建的)
我有一个构建设备+模拟器通用二进制文件的构建脚本,所以我不能使用构建和存档,而是从我的脚本的命令行 运行 xcodebuild
。如何让 xcodebuild
生成正确的启用位码的库?
Bitcode 是编译时特性(不是 link 时特性),这意味着每个 .o 文件在使用 bitcode 构建时都应包含一个名为 __bitcode 的额外部分。您可以通过 运行 otool -l (my .o or .a file) | grep __LLVM
.
正常构建时,Xcode 将构建标志 -fembed-bitcode-marker
添加到任何 clang 调用。这似乎是某种 'this is where bitcode would go, if bitcode was enabled' 的东西,实际上并没有启用位码。
当你 "Build & Archive" 时,这个标志被 -fembed-bitcode
取代,这确实构建了一个启用 Bitcode 的二进制文件。
似乎有两种方法可以使 xcodebuild
使用 -fembed-bitcode
:
- 使用 'archive' 操作,如
xcodebuild -target LookbackSDK archive
而不是xcodebuild -target LookbackSDK build
。这有将二进制文件放在 Xcode 管理器而不是build/
文件夹中的副作用,尽管您可以使用-exportArchive -archivePath ./build
解决这个问题(感谢 @JensAyton) - 通过添加带有
OTHER_CFLAGS="-fembed-bitcode"
的其他 C 标志来强制使用该标志。您的xcodebuild
调用看起来像xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
.
后者是我选择的,这样我就不必更改我的构建系统,但它会为每个文件生成警告,因为现在 -fembed-bitcode-marker
和 -fembed-bitcode
都被发送到铛。幸运的是后者获胜,生成了一个支持 Bitcode 的库!
资源
一旦您为静态库添加了位码支持,它将与 Xcode 不兼容 6. 应用程序不会存档。
我想清楚地提到位码的设置,因为@nevyn 的回答让我有点困惑。
转到构建设置,搜索 "custom compiler flags"。添加-fembed-bitcode
。这将使用位码构建您的库。
使用 Xcode 8,我无法让 OTHER_CFLAGS="-fembed-bitcode"
工作。当我尝试创建包含我的静态框架的应用程序的存档构建时,我将 运行 保留为 was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
的内容。
我真正要找的是这个:
BITCODE_GENERATION_MODE=bitcode
我实际上在聚合目标中使用了一个 运行 脚本,完整的 xcodebuild 行看起来像这样(仅供参考):
xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
Select 项目 在 Build Settings -> Other C flags 上,将 Debug 设置为 -fembed-bitcode-marker 并将 Release 设置为 -fembed-bitcode
在 Build Settings 中,点击顶部的 + 号以添加名称为 BITCODE_GENERATION_MODE 的用户自定义构建设置,并将 Debug 设置为 marker,将 Release 设置为 bitcode
将架构编辑为发布 然后单击所需的库。一个文件并获取构建路径。 获取库表单 Release 文件夹。