Jak xcodebuild statycznej biblioteki z włączonym Bitcode?
Xcode 7 wprowadza Bitcode , który jest rodzajem pośredniego pliku binarnego LLVM, który oznacza, że serwery Apple mogą przekompilować moją aplikację na różne architektury bez mojego udziału.
W Lookback, rozprowadzam statyczny framework archiwum z naszą biblioteką. Wygląda na to, że gdy budujesz za pomocą czegokolwiek oprócz "Build & Archive", bitcode nie jest faktycznie emitowany do mojej biblioteki, a każdy, kto łączy się z moją biblioteką w swojej aplikacji i próbuje zrobić Build & Archive z włączonym Bitcode otrzyma jedno z dwóch ostrzeżeń:
-
ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.
(jeśli lib jest zbudowany z Xcode 6) - Xcodebuild 7 (jeśli lib jest zbudowany z Xcode 7 z normalnym xcodebuild)
Mam skrypt build, który buduje uniwersalny plik binarny device+simulator, więc nie mogę użyć Build & Archive, ale raczej uruchamiam xcodebuild
z linii poleceń z mojego skryptu. Jak Mogę sprawić, by xcodebuild
wygenerowała odpowiednią bibliotekę z kodem bitowym?
4 answers
Bitcode jest funkcją czasu kompilacji (nie funkcją czasu łącza), co oznacza, że każdy .o plik powinien zawierać dodatkową sekcję o nazwie _ _ bitcode, gdy jest zbudowany z bitcode. Możesz sprawdzić, czy Twój plik binarny jest zgodny z kodem bitowym, uruchamiając otool -l (my .o or .a file) | grep __LLVM
.
Gdy budujesz normalnie, Xcode dodaje flagę budowania -fembed-bitcode-marker
do każdego wywołania clang. Wydaje się, że jest to coś w rodzaju "to jest miejsce, gdzie bitcode by poszedł, gdyby bitcode był włączony", a tak naprawdę nie włącza bitcode.
Kiedy "Build & Archive", flaga ta jest zastąpiona przez -fembed-bitcode
, która naprawdę buduje binarny kod bitowy.
Wydaje się, że istnieją dwa sposoby, aby xcodebuild
użyć -fembed-bitcode
:
- użyj akcji 'archive' , jak w
xcodebuild -target LookbackSDK archive
zamiastxcodebuild -target LookbackSDK build
. Jest to efekt uboczny umieszczania plików binarnych w organizerze Xcode zamiast folderubuild/
, ale możesz to obejść używając-exportArchive -archivePath ./build
(dzięki @JensAyton) - Wymuś użycie flagi przez dodanie innych Flag C z
OTHER_CFLAGS="-fembed-bitcode"
. Twójxcodebuild
inwokacja wyglądałaby jakxcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
.
Ten ostatni jest tym, co wybrałem, więc nie muszę zmieniać mojego systemu budowania, ale będzie generował ostrzeżenia dla każdego pliku, ponieważ teraz zarówno -fembed-bitcode-marker
, jak i -fembed-bitcode
są wysyłane do clang. Luckilly ten ostatni wygrywa, generując bibliotekę z obsługą Bitcode!
Zasoby
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:25
Z Xcode 8, nie mogłem dostać OTHER_CFLAGS="-fembed-bitcode"
do pracy. Gdy próbowałem stworzyć Archive build aplikacji zawierającej mój statyczny framework, ciągle natykałem się na coś w stylu was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
.
Naprawdę Szukałem tego:
BITCODE_GENERATION_MODE=bitcode
Używam skryptu Run wewnątrz zagregowanego celu, pełna linia xcodebuild wygląda tak (tylko dla odniesienia):
xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 18:40:20
Po dodaniu obsługi bitcode dla statycznej lib, nie będzie ona zgodna z Xcode 6. Aplikacja nie archiwizuje.
Chciałbym wyraźnie wspomnieć o ustawieniu dla bitcode, ponieważ odpowiedź @ nevyn trochę mnie zdezorientowała.
Przejdź do ustawień kompilacji, wyszukaj "niestandardowe flagi kompilatora". Dodaj -fembed-bitcode
. To zbuduje Twój lib z bitcode.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 10:11:35
Wybierz projekt W Ustawieniach kompilacji - > inne flagi C, Ustaw Debug na-fembed-bitcode-marker i zwolnij na-fembed-bitcode
W Ustawieniach budowania kliknij znak + u góry, aby dodać zdefiniowane przez użytkownika ustawienie budowania o nazwie BITCODE_GENERATION_MODE i ustaw debug na marker, Release to bitcode
Edit schema as Release Więc liż bibliotekę.plik i pobierz ścieżkę budowania Pobierz folder Wydania formularza biblioteki
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 04:47:48