Биткод и дилиб
Я пытаюсь скомпилировать библиотеку C, чтобы использовать ее в своем проекте iOS, и я хочу встроить битовый код.
Я могу успешно создавать статические библиотеки для каждой арки. И эти статические библиотеки содержат битовый код (проверено с помощью otool), но динамическая библиотека не содержит битовый код. Зачем? Бит-код не поддерживается в dylib?
Библиотека, которую я пытаюсь построить - это 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 ответа
Похоже, я не могу добавить битовый код в dylibs. Я попытался создать несколько dylibs, а затем использовать otool -l path_to_dylib | grep bitcode
чтобы проверить, содержат ли они какой-либо битовый код, все ничего не получили.
Больше доказательств:
- в Xcode(7.3.1) у целей macOS (ранее называвшихся OS X) нет опции включения битового кода в настройках сборки
- в разделе битовых кодов приложения Thinning Apple не упоминала битовый код в macOS. Кроме того, приложение Thinning доступно только для iOS, watchOS и tvOS.
В настоящее время я не знаю, почему в приложениях MacOS нет опции включения битового кода в настройке сборки. Может быть, это потому, что магазин Mac App Store - не единственный способ распространения приложений Mac? И люди могут скопировать одно приложение Mac из одного приложения Mac в другое, используя USB-накопители?
Мне не удалось проверить битовый код в моей динамической библиотеке с поддержкой битовых кодов с помощью инструментов линии cmd (otool, file или clang). Также сравнение различий между битовым кодом и сборкой без битового кода не показало никакой разницы, кроме размера файла.
Интересно, что при использовании динамической библиотеки без включенного битового кода в реальном приложении архивация 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...