Xcode 7 apresenta Bitcode , que é algum tipo de binário intermediário LLVM que significa que os servidores da Apple podem recompilar meu aplicativo para diferentes arquiteturas sem meu envolvimento.
No Lookback, distribuo uma estrutura de arquivo estático com nossa biblioteca. Parece que quando você constrói com qualquer coisa que não seja um "Build & Archive", o bitcode não é realmente emitido para minha biblioteca, e qualquer um que se conectar com minha biblioteca em seu aplicativo e tentar fazer um Build & Archive com Bitcode habilitado terá dois avisos:
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.
(se lib for construído com Xcode 6)ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE)
(se lib for construído com Xcode 7 com um xcodebuild normal)
Eu tenho um script de compilação que cria um binário universal de dispositivo + simulador, então não posso usar Build & Archive, mas em vez disso, executo a xcodebuild
partir da linha de comando do meu script. Como posso fazer xcodebuild
gerar uma biblioteca habilitada para bitcode adequada?
Respostas:
Bitcode é um recurso de tempo de compilação (não um recurso de tempo de link), o que significa que cada arquivo .o deve conter uma seção extra chamada __bitcode quando construído com bitcode. Você pode confirmar se seu binário é compatível com código de bits executando
otool -l (my .o or .a file) | grep __LLVM
.Quando você constrói normalmente, o Xcode adiciona o sinalizador de construção
-fembed-bitcode-marker
a qualquer invocação do clang. Isso parece ser uma espécie de 'é para onde o bitcode iria, se o bitcode estivesse habilitado', e não habilita o bitcode.Quando você "Construir e Arquivar", este sinalizador é substituído por
-fembed-bitcode
, que realmente cria um binário habilitado para Bitcode.Parece haver duas maneiras de fazer
xcodebuild
uso-fembed-bitcode
:xcodebuild -target LookbackSDK archive
vez dexcodebuild -target LookbackSDK build
. Isso tem o efeito colateral de colocar binários em seu Xcode Organizer em vez de nabuild/
pasta, embora você possa contornar isso usando-exportArchive -archivePath ./build
(obrigado @JensAyton )OTHER_CFLAGS="-fembed-bitcode"
. Suaxcodebuild
invocação seria semelhante axcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
.Este último é o que eu escolhi para não ter que mudar meu sistema de compilação, mas irá gerar avisos para cada arquivo, pois agora ambos
-fembed-bitcode-marker
e-fembed-bitcode
são enviados para o clang. Felizmente, o último ganha, gerando uma biblioteca habilitada para Bitcode!Recursos
fonte
-fembed-bitcode-marker
ser ignorado adicionando-Qunused-arguments
também.otool -l myfile.o | grep __LLVM
, na verdade , porque haverá um segmento __bitcode mesmo se houver apenas um marcador de código de bits em vez do código de bits real.Com o Xcode 8, não consegui
OTHER_CFLAGS="-fembed-bitcode"
trabalhar. Continuei encontrando algo parecido comwas built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
quando tentei criar um arquivo de compilação de um aplicativo contendo minha estrutura estática.O que eu realmente estava procurando era isto:
BITCODE_GENERATION_MODE=bitcode
Na verdade, estou usando um Run Script dentro de um destino agregado, a linha xcodebuild completa se parece com isto (apenas para referência):
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
fonte
BITCODE_GENERATION_MODE=bitcode
método parece ser o preferido, como sugerido também nesta resposta .Depois de adicionar suporte a bitcode para a biblioteca estática, ele não será compatível com o Xcode 6. O aplicativo não será arquivado.
Eu gostaria de mencionar claramente a configuração do bitcode, pois a resposta de @evynn me confundiu um pouco.
Vá para Configurações de compilação, procure por "sinalizadores de compilador personalizados". Adicionar
-fembed-bitcode
. Isso irá construir sua biblioteca com bitcode.fonte
Selecione o projeto em Configurações de compilação -> Outros sinalizadores C, defina Depurar como -fembed-bitcode-marker e Release para -fembed-bitcode
Em Build Settings, clique no sinal + na parte superior para adicionar uma configuração de build definida pelo usuário com o nome BITCODE_GENERATION_MODE e defina Debug para marcador, Release para bitcode
Edite o esquema como versão Em seguida, clique na biblioteca desejada. Um arquivo e obtenha o caminho de construção. Obtenha a pasta Release do formulário da biblioteca.
fonte