Jaka jest różnica między osadzonymi plikami binarnymi a połączonymi strukturami

87

Podczas korzystania z zewnętrznej struktury Xcode ma teraz sekcję Embedded Binaries oraz Linked Frameworks .

wprowadź opis obrazu tutaj

Kiedy pobierzesz zewnętrzną strukturę i Finder-> przeciągniesz ją do Xcode, umieści ona framework w sekcji Linked Frameworks and Libraries .

Kiedy budujesz bibliotekę z Carthage, zaleca się przeciąganie do sekcji Osadzone pliki binarne .

Wydaje się, że oba działają w kategoriach łączenia, ponieważ API staje się dostępne w obu przypadkach, co więcej, kiedy dodaje się framework do sekcji Osadzone pliki binarne, jest on również automatycznie dodawany do sekcji Połączone struktury i biblioteki .

Więc kto ma rację? Kartagina czy reszta internetu? i dlaczego istnieją 2 opcje włączania zasobów zewnętrznych do projektów Xcode?

Maxim Veksler
źródło
I czy to działa, gdy testujesz na urządzeniu?
trojanfoe
@trojanfoe tak, to robi.
Maxim Veksler
To nie ma sensu, chyba że jest to 1) w sekcji osadzonych plików binarnych lub 2) ma krok kompilacji, aby skopiować strukturę do pakietu aplikacji podczas kompilacji.
trojanfoe
2
Carthage zaleca przeciąganie do "Osadzonych plików binarnych" tylko dla aplikacji OSX. W przypadku iOS zalecają tylko „Połączone struktury i biblioteki”.
Damnum
Możliwy duplikat
pliku

Odpowiedzi:

72
  1. Łączenie - musimy połączyć framework, jeśli używamy zdefiniowanego w nim API.

  2. Osadzanie - ten proces zapewni, że dodana struktura zostanie osadzona w pakiecie aplikacji i potencjalnie pomoże w udostępnianiu kodu między aplikacją a pakietami rozszerzeń. Osadzamy tylko frameworki stron trzecich, a nie te dostarczane przez iOS, ponieważ są one łatwo dostępne na urządzeniu. Jeśli osadzamy, oznacza to, że będziemy musieli również połączyć się z nimi, aby Xcode mógł skompilować i utworzyć kompilację. Gdy aplikacja działa na urządzeniu, osadzona struktura zostanie w razie potrzeby załadowana do pamięci.

Shripada
źródło
1
Co masz na myśli mówiąc o części „w razie potrzeby”? Czy to oznacza, że ​​osadzona struktura jest ładowana, gdy jest potrzebna w czasie wykonywania? Ponadto, jak myślisz, kiedy nastąpi linkowanie w przypadku dynamicznej platformy?
Bartosss
Czy jest przypadek, w którym potrzebujemy embed, a nie linkto? I wzajemnie? I dlaczego?
allenlinli
Myślę, że wystarczy linkować frameworki, których API używasz bezpośrednio w kodzie, zależności przechodnie, które nie są przywoływane w kodzie aplikacji, powinny być po prostu osadzone, jeśli mam rację.
Werner Altewischer
15

Jeśli osadzisz plik binarny, zostanie on uwzględniony w Twoim produkcie. Jeśli połączysz tylko bibliotekę lub strukturę bez osadzania jej, nie będzie ona częścią Twojego produktu.

Jednak w iOS8 wszystkie frameworki innych firm muszą być „osadzone”. Nawet struktura współdzielona przez różne programy musi być „osadzona” w każdym z tych programów. W przypadku, gdy została ona zainstalowana na urządzeniu w udostępnionej lokalizacji, każdy inny proces instalacji korzystający z tego samego „osadzonego” kodu z udostępnionej lokalizacji może ponownie wykorzystać tę istniejącą instalację. Jest to specyficzne dla iOS8, nie było możliwe przed iOS8 i poza światem iOS ta odpowiedź nie byłaby dokładna.

Basti
źródło
2
„Osadzenie pliku binarnego ułatwi użytkownikowi zainstalowanie produktu w przypadku, gdy użytkownik nie ma jeszcze działającej instalacji tych elementów na swoich komputerach” brzmi jak OSX, a nie iOS ... jeśli nie mają biblioteki zainstalowana (tzn. jest niestandardowa), aplikacja po prostu się nie załaduje.
trojanfoe
nie tylko by się nie załadował, @trojanfoe, zostałby odrzucony i nie mógłbyś go zainstalować w pierwszej kolejności (chyba że jesteś programistą lub używasz konta Enterprise ...)
dogsgod
Frameworki połączone dynamicznie są możliwe od iOS 8
Basti
Gdy użytkownik instaluje Twoją aplikację i jeśli ta aplikacja zawiera dynamicznie połączoną strukturę, można ją wyszukiwać automatycznie. Jest to jednak dodatkowy punkt, który może się nie powieść podczas procesu instalacji użytkownika, powodując błąd edycji łącza, który kończy działanie aplikacji. Nie widzę więc powodu, dla którego odpowiedź miałaby dotyczyć tylko OS X, a nie iOS. Proszę podać bardziej szczegółowe informacje, jeśli widzisz miejsce na poprawę mojej odpowiedzi. Lub zagłosuj na tę odpowiedź, aby uczynić innego programistę pełnoprawnym członkiem SO, jeśli uważasz, że odpowiedź jest już poprawna;)
Basti
Jest to opcjonalny aspekt twojej odpowiedzi, któremu się sprzeciwiam. Jeśli platforma jest innej firmy, musi być częścią pakietu aplikacji. Kropka. Dotyczy to również w dużej mierze aplikacji na OSX (z pewnością w przypadku aplikacji rozpowszechnianych za pośrednictwem Mac App Store).
trojanfoe
0

Linkingwięcej na Linkerten temat działa w czasie kompilacji lub wczytywania / uruchamiania. Linker skopiuj a Librarydo docelowego pliku binarnego. Ponieważ Frameworkjest autonomiczny, Linkerw tym przypadku jest odpowiedzialny za znajdowanie i łączenie Dynamic Frameworkwewnętrznej ścieżki programu ładującego system lub znajdowanie i łączenie w pakiecie .

Embeddingjest procesem kopiowania pliku binarnego do docelowego pliku binarnego. Dzięki temu będzie się znajdował wewnątrz.

Przeczytaj więcej tutaj

yoAlex5
źródło
-3

O ile mi wiadomo, osadzony plik binarny zawiera tylko dynamiczną strukturę dostępną w systemie iOS 8 i nowszym, w przeciwnym razie można połączyć tylko strukturę statyczną.

Lei Zhang
źródło