2016-05-16 68 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行工具驗證的方法...