2016-05-16 77 views
2

我想编译一个C库在我的iOS项目中使用它,并且我想嵌入位码。位码和dylib

我可以成功构建针对每个拱门的静态库。这些静态库确实包含位码(使用otool进行检查),但动态库不包含位码。为什么? 是否在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 

谢谢!

回答

0

它看起来像我不能将位码添加到dylibs。我试着建立几个dylib,然后用otool -l path_to_dylib | grep bitcode来测试它们是否包含任何bitcode,都没有任何东西。

更多的证据:

    在Xcode
  • (7.3.1),MACOS(以前称为OS X)的目标没有能够在生成设置在App Thinning,苹果位码段位码选项
  • 在macOS上没有提到bitcode。另外,应用程序细化仅适用于iOS,watchOS和tvOS。

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

+0

我不确定你的答案,那个动态库不会支持位码。我发现这个答案,表明它支持bitcode:http://stackoverflow.com/a/38125767/2302437。同时增加'-fembed-bitcode'会增加文件大小,为什么? –

+0

@BenMarten嗯,我认为bitcode也可以在dylib中支持!但是我在答案时所做的实验表明,我无法从dylib中提取位代码。另外,在我试图用liblzma.dylib替换liblzma.a后,Xcode抱怨说liblzma.dylib不包含位代码。也许我做错了什么? – Automatic

+0

如果你想检查位码,看看'ebcutil':https://github.com/JDevlieghere/LibEBC。 (免责声明:我是图书馆的作者) – Jonas

0

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

有趣的是使用withouth的在实际应用和归档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 

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