2015-10-13 5 views
8

Środowisko: XCode 7.0.1 Moduł: Objective-C Bundle Rodzaj: RamyJak zrobić grubą ramkę z opcją bitcode?

Witam, staram się stworzyć ramy wspierania ARMv7, armv7s, arm64, i386 i x86_64. Używam agregatu do stworzenia biblioteki tłuszczu. Wewnątrz skryptu agregującego uruchamiam dwie komendy xcodebuild 1. dla armv7, armv7s i arm64 i 2. dla architektur i386 i x86_64. Ponadto ustawiłem opcję Enable Bitcode = YES i Other C Flags = -fembed-bitc pod ustawieniami docelowej kompilacji. Jako środek ostrożności mesasure, dodaję ENABLE_BITCODE = TAK i OTHER_CFLAGS = "- fembed-bitcode" opcje do polecenia xcodebuild

Moje Xcode zbudować polecenia są następujące -

#Build The framework Target for iPhoneOS 
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${AN_TARGET}" 
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphoneos 
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" 
CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}" SYMROOT="${SYMROOT}" 
ARCHS="armv7 armv7s arm64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION 

#Build The framework Target for iPhoneSimulator 
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${AN_TARGET}" 
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphonesimulator 
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" 
CONFIGURATION_BUILD_DIR="${IPHONE_SIMULATOR_BUILD_DIR}" SYMROOT="${SYMROOT}" 
ARCHS="i386 x86_64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION 

po uruchomieniu dwóch powyższych komend , jestem łącząc te dwa buduje dokonać tłuszczu ramową binarnie za pomocą poniższego polecenia

# create a fat Framework 
lipo -create 
"${IPHONE_DEVICE_BUILD_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}" 
"${IPHONE_SIMULATOR_BUILD_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}" - 
output "${FRAMEWORK_FOLDER}/${AN_END_USER_FRAMEWORK_NAME}" 

kwestia iam licowa jest po utworzeniu lipo, nie jestem w stanie go używać w aplikacji bitcode włączona. Po uruchomieniu otool -l framework_binary | grep -LLVM nie widzę flag obsługujących bitc lub __LLVM.

Lipo usuwa kod binarny z tłuszczu. Czy jest jakiś sposób na zatrzymanie bitu podczas wykonywania polecenia lipo?

Korekta: Na podstawie odpowiedzi od Nestora wykonałem polecenie otool jako otool -l -arch armv7 framework_binary | grep LLVM i ku mojemu zaskoczeniu mogłem zobaczyć klątwę __LLVM. Jednak, kiedy integruję ten sam gruby framework binarny z moim projektem, to działa on dobrze na symulatorze, ale generuje następujący błąd podczas działania na urządzeniu - ld: "MyBinary" nie zawiera bitu. Musisz go odbudować z włączonym bitcodem (ustawienie Xcode ENABLE_BITCODE), uzyskać zaktualizowaną bibliotekę od dostawcy lub wyłączyć bitcode dla tego celu. dla architektury armv7

+1

Czy to nie powinno być 'grep LLVM', a nie' grep -LLVM'? – l00phole

+0

Ten sam problem tutaj. * .a zawiera bitmę przed lipo, ale nie po. – Nestor

+0

Czy sprawdziłeś, czy binarny dla iphoneos (to znaczy dla urządzenia przed integracją z lipo) ma kod bitowy? Jeśli go nie ma, to nie lipo usuwa odcinek bitu. –

Odpowiedz

5

Na szczęście to tylko problem z raportowaniem otool, a nie lipo; trzeba dodać parametr -arch:

otool -arch arm64 -l myLipoOutput.a 

Źródło: http://www.openradar.me/radar?id=6301306440384512

+0

próbowałem tego. Niestety, wygląda na to, że gruby plik binarny nie zawiera flag bitcodów. tak jak po uruchomieniu go na symulatorze, to dobrze zbudowany, ale gdy buduję go dla urządzenia z Enable Bitcode = YES w ustawieniach docelowego budowania aplikacji, otrzymuję błąd ld: "myBinary" nie zawiera bitu. Musisz go odbudować z włączonym bitcodem (ustawienie Xcode ENABLE_BITCODE), uzyskać zaktualizowaną bibliotekę od dostawcy lub wyłączyć bitcode dla tego celu. –

+0

Przykro to słyszeć. Jesteś pewien, że to lipo to usuwa? – Nestor

+0

Myślę, że problem jest tutaj trochę inny. Kiedy uruchomiłem polecenie odool z -arch armv7 i armv7s, arm64 otrzymuję nazwę __LLVM, ale kiedy buduję swoją aplikację dla urządzenia z binarnym grubym plikiem binarnym, pojawia się następujący błąd ld: "MyBinary" nie zawiera bitu. Musisz go odbudować z włączonym bitcodem (ustawienie Xcode ENABLE_BITCODE), uzyskać zaktualizowaną bibliotekę od dostawcy lub wyłączyć bitcode dla tego celu. dla architektury armv7 –

0

To wygląda na błąd w Xcode 7.0.1. Miałem ten sam problem i obniżenie wersji Xcode do wersji 7 naprawiło to.

Aktualizacja: Faktycznie może to być błąd w Xcode 7, która została ustalona w 7.0.1 - this SO answer rozwiązać ten problem dla mnie.

+0

Dzięki @silyevsk, spróbuję. –

+0

@DeepakBadiger - Wygląda na to, że http://stackoverflow.com/a/31346742/390928 rozwiązał to dla mnie – silyevsk

+0

Dzięki @silyevsk. Podążałem za tym URL-em już bez powodzenia. Co to jest i $ Action, której powinienem użyć, aby działało, ponieważ mówi, że utworzy bitcode tylko dla kompilacji archiwum/produkcji? –

6

Jest coś dziwnego, nie ma wielu dokumentacja to zrobić, w końcu mogę użyć tego polecenia:

xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${FRAMEWORK_NAME} ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode FRAMEWORK_SEARCH_PATHS="${FRAMEWORK_SEARCH_PARTH} ${SRCROOT}/**" -sdk ${SIMULATOR_SDK} -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${SIMULATOR_SDK} 2>&1 

xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${FRAMEWORK_NAME} -sdk ${DEVICE_SDK} ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode FRAMEWORK_SEARCH_PATHS="${FRAMEWORK_SEARCH_PARTH} ${SRCROOT}/**" -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${DEVICE_SDK} 2>&1 

dodać flagę BITCODE_GENERATION_MODE = bitcode do polecenia xcodebuild

+0

Więcej informacji na ten temat: http://stackoverflow.com/questions/34959767/whats-the-difference-between-fembed-bitcode-and-bitcode-generation-mode –

+1

Jak to rozwiązuje problem 'lipo'? 'lipo' usuwa każdy bitcode podczas scalania. –

+1

Na końcu rozwiązać ten problem przy użyciu bieżących poleceń: xcodebuild -Project $ {PROJECT_NAME} .xcodeproj ONLY_ACTIVE_ARCH = NIE ENABLE_BITCODE = TAK BITCODE_GENERATION_MODE = bitcode -sdk $ {} SIMULATOR_SDK konfigurację $ {Konfiguracja} czysty build CONFIGURATION_BUILD_DIR = $ {BUILD_DIR}/$ {Konfiguracja} - $ {SIMULATOR_SDK} 2> & 1 xcodebuild -Project $ {PROJECT_NAME} .xcodeproj -sdk $ {DEVICE_SDK} ONLY_ACTIVE_ARCH = NR ENABLE_BITCODE = TAK BITCODE_GENERATION_MODE = bitcode -konfigurację $ {Konfiguracja} czysty budowy CONFIGURATION_BUILD_DIR = $ {BUILD_DIR}/$ {KONFIGURACJA} - $ {DEVICE_SDK} 2> & 1 –

1

spróbuj użyć archiwum dla plasterków ramienia zamiast kompilacji

xcodebuild -scheme "${SCHEME}" -workspace "${WORKSPACE}" -configuration "${CONFIGURATION}" -sdk iphoneos ARCHS="arm64 armv7 armv7s" CONFIGURATION_BUILD_DIR="${CONFIGURATION_BUILD_DIR}/arm" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=NO archive 

Po tym uruchom lipo, aby połączyć symulator i ramię.

A po tym uruchomieniu otool -arch arm64 -l myLipoOutput.a i powinno działać.