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?

Author: user102008, 2015-07-18

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 zamiast xcodebuild -target LookbackSDK build. Jest to efekt uboczny umieszczania plików binarnych w organizerze Xcode zamiast folderu build/, 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ój xcodebuild inwokacja wyglądałaby jak xcodebuild 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

 116
Author: nevyn,
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

 17
Author: Aaron Ash,
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.

 16
Author: Gautam Jain,
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

 1
Author: Oshitha Wimalasuriya,
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