位码和dylib

Bitcode and dylib

我正在尝试编译一个 C 库以在我的 iOS 项目中使用它,并且我想嵌入 bitcode。

我可以成功构建针对每个拱门的静态库。那些静态库确实包含位码(使用otool检查),但动态库不包含位码。为什么? dylib不支持bitcode吗?

我要构建的库是 xz。这是脚本

build_iOS()
{
    ARCH=

    if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ];
    then
        SDKROOT="$(xcodebuild -version -sdk iphonesimulator | grep -E '^Path' | sed 's/Path: //')"
    else
        SDKROOT="$(xcodebuild -version -sdk iphoneos | grep -E '^Path' | sed 's/Path: //')"
    fi

    export CC="$(xcrun -sdk iphoneos -find clang)"
    export CFLAGS="-fembed-bitcode -isysroot $SDKROOT -arch ${ARCH} -miphoneos-version-min=9.0"
    export LDFLAGS="-arch ${ARCH} -isysroot $SDKROOT"

    if [ $ARCH == "i386" ] || [ $ARCH == "x86_64" ];
    then
        ./configure --prefix=$XZPATH/build/iOS/$ARCH --host=i686-apple-darwin11 --disable-static --enable-shared
    else
        ./configure --prefix=$XZPATH/build/iOS/$ARCH --host=arm-apple-darwin --disable-static --enable-shared
    fi

    make && make install && make clean
}
build_iOS i386
build_iOS x86_64
build_iOS armv7
build_iOS armv7s
build_iOS arm64

谢谢!

看来我无法将位码添加到动态库中。我尝试构建几个动态库,然后使用 otool -l path_to_dylib | grep bitcode 测试它们是否包含任何位码,但都没有。

更多证据:

  • 在 Xcode(7.3.1) 中,macOS(以前称为 OS X)目标在构建设置中没有启用位码选项
  • App Thinning 的 bitcode 部分,Apple 没有提到 macOS 的 bitcode。此外,App Thinning 仅适用于 iOS、watchOS 和 tvOS。

我目前不知道为什么 macOS 应用程序在构建设置中没有启用位码选项。也许是因为 Mac App store 不是分发 mac 应用程序的唯一途径?人们可能会使用 U 盘将一个 mac 应用程序从一个 mac 应用程序复制到另一个应用程序?

我无法通过 cmd 行工具(otool、文件或 clang)验证启用位码的动态库中的位码。还比较了 bitcode 和非 bitcode 构建之间的差异,除了文件大小之外没有任何差异。

有趣的是,当在实际应用程序中使用没有启用位码的动态库时,归档 xcode 在我使用非位码构建时将无法归档:

ld: bitcode bundle could not be generated because '...' was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build for architecture armv7

在启用 bitcode 的情况下构建 dylib 时,文件大小会增加很多,而且 xcode 在启用 bitcode 的情况下归档示例项目也不会失败。所以我很确定 bitcode 必须包含在动态库中,尽管我们还没有找到通过 cmd 行工具验证这一点的方法......