Bitcode和dylib

时间:2016-05-16 19:59:18

标签: ios c cross-compiling bitcode

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

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

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

build_iOS()
{
    ARCH=$1

    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

谢谢!

2 个答案:

答案 0 :(得分:0)

看起来我无法将bitcode添加到dylibs。我尝试构建了几个dylib,然后使用otool -l path_to_dylib | grep bitcode来测试它们是否包含任何bitcode,都没有任何结果。

更多证据:

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

我目前不知道为什么macOS应用程序在构建设置中没有启用bitcode选项。也许是因为Mac App商店不是分发mac应用程序的唯一方式?人们可能会使用USB记忆棒将一个mac app从一个mac app复制到另一个mac app?

答案 1 :(得分:0)

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

有趣的是,当在实际应用程序中使用动态库而不使用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时,文件大小会增加很多,并且在编译启用了bitcode的示例项目时xcode也不会失败。所以我很确定bitcode必须包含在动态库中,尽管我们还没有找到通过cmd行工具验证的方法......