Jest dobre pytanie o różnicę między tymi dwiema opcjami, jak opisano w sekcji Łączenie pliku binarnego z bibliotekami a struktury osadzania .
Wygląda na to, że mamy opcje, aby używać ich obu, tylko zastanawiam się, w którym przypadku powinniśmy lepiej używać osadzonych plików binarnych, czy raczej niż połączonego frameworka?
Jakieś solidne przykłady, które pozwolą lepiej rozwiązać ten problem? Dzięki
ios
xcode
frameworks
embedded-binary
Forrest
źródło
źródło
Odpowiedzi:
Pytanie, które utworzyłeś, odnosi się do funkcji „Połącz plik binarny z bibliotekami”, która różni się nieco od osadzonego pliku binarnego.
„Połącz plik binarny z bibliotekami” oznacza to, czego można oczekiwać w odniesieniu do łączenia: bez względu na to, czy plik binarny jest biblioteką statyczną, biblioteką dynamiczną czy frameworkiem, zostanie połączony z kodem obiektowym w czasie łączenia po kompilacji.
Kiedy myślisz o połączeniu z biblioteką statyczną, to, co się dzieje, jest całkiem jasne: linker kopiuje kod z biblioteki (np.
libFoo.a
) Do wyjściowego pliku binarnego. Twój plik wyjściowy rośnie, ale nie musi rozwiązywać żadnych zewnętrznych zależności w czasie wykonywania. Wszystko, czego program potrzebuje do uruchomienia (w odniesieniu do biblioteki statycznej), jest obecne po jego zbudowaniu.W przypadku biblioteki dynamicznej (.dylib lub frameworku dostarczonego przez system) oczekuje się, że biblioteka, z którą się łączysz, będzie znajdować się gdzieś w ścieżce systemu ładującego bibliotek dynamicznych podczas uruchamiania programu. W ten sposób nie masz narzutu kopiowania wszystkich zewnętrznych bibliotek stron trzecich do swojego pliku binarnego, a wszystkie różne programy na komputerze, które również łączą się z tą biblioteką, będą w stanie ją znaleźć, co oszczędza minimalnie miejsce na dysku, ale także potencjalnie miejsce w pamięci, w zależności od tego, jak i gdzie system buforuje biblioteki.
Framework jest bardzo podobny do biblioteki dynamicznej, ale może zawierać zasoby w swojej strukturze katalogów (obrazy, audio, inne frameworki itp.). W tym przypadku prosty statyczny Biblioteka lub .dylib plik nie będzie go wyciąć, więc może trzeba linku do ramy tak , że można znaleźć to, czego potrzebuje, aby działać prawidłowo.
Kiedy łączysz się z platformą zewnętrzną (powiedz coś, co pobrałeś z github i zbudowałeś samodzielnie), może nie być obecny w systemie, na którym zamierzasz działać. W takim przypadku nie tylko utworzyłbyś link do frameworka, ale również osadziłbyś go w pakiecie aplikacji, korzystając z fazy „Kopiuj struktury”. Gdy program jest uruchomiony, konsolidator środowiska wykonawczego (inaczej resolver) zajrzy do pakietu oprócz ścieżki programu ładującego system, znajdzie osadzoną strukturę i połączy ją, aby aplikacja miała kod potrzebny do uruchomienia.
Wreszcie, to, co właściwie jest „osadzonym plikiem binarnym”, to plik wykonywalny, który zarówno osadzasz w pakiecie aplikacji za pośrednictwem fazy kopiowania plików, jak i wykonujesz samodzielnie, być może za pomocą wywołania
popen()
lub podobnego. Osadzony plik binarny może zostać wywołany przez Twój program, ale nie jest z nim powiązany. Jest to w pełni zewnętrzna jednostka (podobnie jak programy w/bin
katalogu).W praktyce w przypadku bibliotek i frameworków dostarczonych przez system będziesz łączył się z nimi i to wszystko, co musisz zrobić.
Jeśli chcesz połączyć zbudowaną przez siebie bibliotekę, która nie wymaga żadnych zasobów osadzonych (tj. Nie wymaga istnienia struktury), możesz po prostu połączyć się z biblioteką statyczną. Jeśli zauważysz, że masz wiele modułów w swoim programie, które chcą używać tego samego kodu biblioteki, przekonwertowanie go na strukturę lub bibliotekę dynamiczną i połączenie z nimi może zaoszczędzić miejsce i może być wygodne (szczególnie jeśli problemem jest użycie pamięci).
Wreszcie, frameworki mogą zawierać nie tylko zasoby, ale także pliki nagłówkowe i / lub licencyjne. Używanie frameworka do przenoszenia tych plików jest w rzeczywistości wygodnym mechanizmem dystrybucji, więc często możesz chcieć włączyć framework tylko po to, aby te rzeczy mogły tagować wraz z twoim plikiem binarnym (tj. Wymagania licencyjne mogą uczynić to obowiązkowym).
--- EDYTOWAĆ ---
Adam Johns opublikował następujące pytanie jako komentarz:
Mówię, że osadzony plik binarny to po prostu kolejny plik zasobów w twoim pakiecie, taki jak plik audio lub obraz, chociaż plik jest zamiast tego wykonywalnym narzędziem wiersza poleceń.
popen()
Function (man popen
od terminala, aby przeczytać więcej o tym) pozwala na wykonywanie dowolnych programów z innego uruchomionego programu.system()
Funkcja jest inna droga. Są inne i podam tutaj historyczny przykład, który może sprawić, że zrozumienie użycia osadzonego pliku binarnego będzie nieco bardziej przejrzyste:Jak zapewne wiesz, po uruchomieniu aplikacji w systemie Mac OS X jest ona uruchamiana z identyfikatorem bieżącego użytkownika. W większości typowych instalacji jest to domyślny użytkownik na pulpicie
admin
, któremu nadawany jest identyfikator użytkownika501
.W systemach operacyjnych opartych na Uniksie tylko
root
użytkownik (identyfikator użytkownika0
) ma pełny dostęp do całego systemu plików. Czasami zdarza się, że program instalacyjny uruchamiany przez użytkownika Pulpitu musi zainstalować pliki w uprzywilejowanym katalogu (na przykład sterowniki). W takim przypadku aplikacja musi przekazać swoje uprawnieniaroot
użytkownikowi, aby mógł pisać w tych zastrzeżonych katalogach.Aby ułatwić to w systemach operacyjnych za pośrednictwem OS X 10.7, firma Apple udostępniła w swoim interfejsie API usług autoryzacyjnych funkcję AuthorizationExecuteWithPrivileges () (jest to obecnie przestarzałe, ale nadal stanowi użyteczny przykład).
AuthorizationExecuteWithPrivileges()
jako argument wziął ścieżkę do narzędzia wiersza poleceń do wykonania jakoroot
. Narzędziem wiersza poleceń był wykonywalny skrypt powłoki lub skompilowany plik binarny napisany w celu uruchomienia logiki instalacji. To narzędzie zostało zainstalowane w pakiecie aplikacji, tak jak każdy inny plik zasobów.Po wywołaniu system operacyjny wyświetli okno dialogowe autoryzacji z prośbą o podanie hasła użytkownika (widzieliście to już wcześniej!), A po wprowadzeniu uruchomi program
root
w imieniu Twojej aplikacji. Ten proces jest podobny do zwykłego wykonania programu zepopen()
sobą, chociażpopen()
sam nie daje korzyści z eskalacji uprawnień.źródło
link
, ale masz rację, że musisz go również osadzić w fazie kopiowania plików (w przeciwnym razie jak byś go użył?). Celem korzystania z platformy zewnętrznej lub osadzonego pliku binarnego jest wykonanie kodu dostarczonego przez jednostkę. W przypadku osadzonego pliku binarnego nie jest wymagane łączenie. W czasie wykonywania konstruujesz ścieżkę do pliku binarnego, a następnie ręcznie go uruchamiasz. W przypadku frameworka konsolidator czasu kompilacji połączy go podczas budowania aplikacji, a następnie (jeśli jest to framework innej firmy) osadza go w fazie kopiowania plików, a na końcu konsolidator środowiska uruchomieniowego łączy go ponownie po uruchomieniu aplikacji .W skrócie,
czemu?
źródło
Jest częścią
Dependency
zarządzania [Informacje]Należy pamiętać, że
Xcode 11
zawiera tylkoFrameworks, Libraries, and Embedded Content
sekcję wGeneral
zakładceLink binarny
Build Phases -> Link Binary With Libraries
jest lustremGeneral -> Linked Frameworks and Libraries
.Biblioteka statyczna i struktura
Jeśli dodasz
Static Library or Static Framework
do tej sekcji, pojawi się ona wFrameworks
grupie [About] (Project Navigator -> <workspace/project> -> Frameworks
) i zostanie dodana referencja do twojego projektu. Wtedy będzie używany przezStatic Linker
.Static Linker
w czasie kompilacji włączy / skopiuje cały kod z biblioteki do wykonywalnego pliku obiektowego.Static linker
działa w połączeniu zBuild Settings -> <Library/Framework> Search Paths
Static Library
Build Settings -> Library Search Paths
[nie znaleziono biblioteki] Jeśli nie dodasz astatic library
do tej sekcji, pojawi się błąd konsolidatora [ld: nie znaleziono symboli]Static Framework
Build Settings -> Framework Search Paths
. Jeśli nie dodaszstatic framework
do tej sekcji, otrzymasz błąd kompilacji [Nie ma takiego modułu]Osadź plik binarny
Biblioteka statyczna i struktura statyczna
Osadzanie nie miałoby żadnego sensu dla a
Static Library
iStatic Framework
ponieważ symbole z nich są kompilowane do wykonywalnego pliku binarnego. Xcode nie pozwoli ci upuścić astatic library
w sekcji Osadzanie.Dynamiczna struktura
Build Phases -> Embed Frameworks
jest lustremGeneral -> Embedded Binaries
. Osadzenie faktycznie dodaje kopię struktury do pakietu aplikacji. W rezultacie, kiedy framework zostanie dodany / usunięty zEmbed
sekcji, zostanie automatycznie dodany / usunięty zLinked
sekcji. Domyślnie folder pakietu to,Frameworks
ale możesz go zmienić za pomocąDestination
pola. Ponadto możesz określić plikSubpath
.Dynamic linker :dyld
przy ładowaniu lub w czasie wykonywania spróbuje znaleźć osadzoną strukturę za pomocą@rpath
[Informacje] Jeśli nie zostanie znaleziona, wystąpi błąd [dyld: Biblioteka nie została załadowana][W przypadku korzystania z łącza i umieszczania]
[Słownictwo]
źródło