Qual é a diferença entre binários incorporados e frameworks vinculados

87

Ao usar o framework externo, o Xcode agora tem uma seção de binários incorporados , bem como de frameworks vinculados .

insira a descrição da imagem aqui

Quando você baixa uma estrutura externa e o Finder-> arrasta para o Xcode, ela colocará a estrutura na seção de Frameworks e Bibliotecas vinculadas .

Quando você constrói uma biblioteca com Carthage, recomenda arrastar para a seção Binários incorporados .

Ambos parecem estar funcionando em termos de ligação, já que a API se torna disponível de qualquer maneira, ainda mais quando adicionar uma estrutura na seção de binários incorporados é que ela também é adicionada automaticamente na seção Estruturas e bibliotecas vinculadas .

Então, quem está certo? Cartago ou o resto da Internet? e por que existem 2 opções para incluir recursos externos em projetos Xcode?

Maxim Veksler
fonte
E funciona quando você testa no dispositivo?
trojanfoe
@trojanfoe, sim.
Maxim Veksler
Isso não faz sentido, a menos que seja 1) na seção de binários incorporados ou 2) tenha uma etapa de compilação para copiar a estrutura para o pacote de aplicativos durante a compilação.
trojanfoe
2
Carthage recomenda arrastar para "Binários incorporados" apenas para aplicativos OSX. Para iOS, eles recomendam apenas "Linked Frameworks and Libraries".
Droga

Respostas:

72
  1. Linking- Devemos vincular um framework se usarmos alguma API definida nele.

  2. Incorporação - Este processo garantirá que a estrutura adicionada seja incorporada ao pacote de aplicativos e potencialmente ajudará no compartilhamento de código entre o aplicativo e quaisquer pacotes de extensão. Incorporamos apenas estruturas de terceiros e não as fornecidas pelo iOS, pois estão prontamente disponíveis no dispositivo. Se estivermos incorporando, isso significa que precisaremos vincular a eles também para que o Xcode possa compilar e criar a construção. Quando o aplicativo é executado no dispositivo, a estrutura incorporada é carregada na memória quando necessário.

Shripada
fonte
1
O que você quer dizer com a parte "quando necessário"? Isso significa que a estrutura incorporada é carregada quando é necessária durante o tempo de execução? Além disso, quando você acha que a vinculação acontecerá para uma estrutura dinâmica?
bartosss 01 de
Existe um caso que precisamos para embedisso e não linké? E vice versa? E porque?
allenlinli
Eu acho que você só precisa vincular estruturas cuja API você usa diretamente no código, dependências transitivas que não são referenciadas no código do aplicativo devem apenas ser incorporadas se eu estiver correto.
Werner Altewischer
15

Se você incorporar o binário, ele será incluído em seu produto. Se você vincular apenas uma biblioteca ou estrutura sem incorporá-la, ela não fará parte do seu produto.

No entanto, no iOS8, todas as estruturas de terceiros precisam ser "incorporadas". Mesmo uma estrutura compartilhada entre vários programas precisa ser "embutida" em cada um desses programas. No caso em que foi instalado no dispositivo em um local compartilhado, qualquer outro processo de instalação usando o mesmo código "incorporado" do local compartilhado pode reutilizar a instalação existente. Isso é específico do iOS8, não era possível antes do iOS8 e fora do mundo do iOS essa resposta não seria precisa.

Basti
fonte
2
"Incorporar o binário tornará mais fácil instalar seu produto para o usuário, caso ele ainda não tenha uma instalação funcional dessas coisas em suas máquinas" soa como OSX, não iOS ... se eles não tiverem a biblioteca instalado (ou seja, não é padrão), o aplicativo simplesmente não carrega.
trojanfoe
ele não apenas não carregaria, @trojanfoe, como seria rejeitado e você não poderia instalá-lo em primeiro lugar (a menos que você seja o desenvolvedor ou use uma conta Enterprise ...)
dogsgod
Estruturas vinculadas dinamicamente são possíveis desde iOS 8
Basti
Quando o usuário instala seu aplicativo e se esse aplicativo inclui uma estrutura vinculada dinamicamente, essa estrutura pode ser pesquisada automaticamente. No entanto, este é um ponto adicional que pode falhar durante o processo de instalação do usuário, gerando um erro de edição de link que encerra o aplicativo. Portanto, não vejo razão para que a resposta se aplique apenas ao OS X e não ao iOS. Por favor, seja mais específico se você vê espaço para melhorias em relação à minha resposta. Ou vote positivamente nessa resposta para tornar um colega desenvolvedor um membro pleno do SO, se você acha que a resposta já está correta;)
Basti
É o aspecto opcional da sua resposta que me oponho. Se a estrutura for de terceiros, ela deve fazer parte do pacote de aplicativos. Período. Isso também é muito verdadeiro para os aplicativos OSX (certamente para aplicativos distribuídos através da Mac App Store).
trojanfoe
0

Linkingmais sobre Linkerisso funciona em tempo de compilação ou tempo de carregamento / execução. Linker copie um Libraryem um binário de destino. Como Frameworké autônomo, o Linker, neste caso, é responsável por localizar e vincular o caminho do carregadorDynamic Framework do sistema ou localizar e vincular dentro de um bundle .

Embeddingé um processo de copiar o binário para o binário de destino. Como resultado, ele estará localizado no interior.

Leia mais aqui

yoAlex5
fonte
-3

Pelo que entendi, o binário incorporado inclui apenas a estrutura dinâmica que está disponível no iOS 8 e superior, caso contrário, você só pode vincular a estrutura estática.

Lei Zhang
fonte