Aplikacja na iOS z frameworkiem uległa awarii na urządzeniu, dyld: Biblioteka nie załadowana, Xcode 6 Beta


573

Ta awaria była problemem blokującym. Aby odtworzyć problem, wykonałem następujące kroki:

  • Utwórz projekt Cocoa Touch Framework
  • Dodaj szybki plik i psa klasy
  • Zbuduj platformę dla urządzenia
  • Utwórz aplikację Single View w Swift
  • Zaimportuj platformę do projektu aplikacji
  • Utwórz instancję szybkiej klasy z frameworka w ViewController
  • Zbuduj i uruchom aplikację na urządzeniu

Aplikacja natychmiast uległa awarii podczas uruchamiania, oto dziennik konsoli:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found

Próbowałem zbudować na urządzeniach iOS 7.1 i 8.0, oba mają tę samą awarię. Mogę jednak zbudować aplikację i dobrze uruchomić na symulatorze. Wiem też, że mogę zmienić strukturę, aby utworzyć Wymagane na Opcjonalne w Link Binary With Libraries , ale nie rozwiązało to całkowicie problemu, aplikacja uległa awarii podczas tworzenia instancji Dog . Zachowanie jest inne na urządzeniu i symulatorze, podejrzewam, że nie możemy dystrybuować frameworka na urządzenie za pomocą wersji beta Xcode. Czy ktoś może rzucić na to światło?


1
Nie rozumiem, dlaczego wszystkie inne frameworki innych firm działają od razu po wyjęciu z pudełka i można je łatwo przeciągać i upuszczać, Link Binary with Librariesa Xcode wie, jak je skopiować do pakietu aplikacji, podczas gdy w przypadku niestandardowych ram po prostu tak się nie dzieje.
fatuhoku

Odpowiedź Sazzada Hissaina Khana tutaj stackoverflow.com/questions/26024100/... jest najlepszą odpowiedzią ..
Ankit Kumar


możesz zrobić grubą bibliotekę, możesz zobaczyć ten link: stackoverflow.com/a/54977145/3992606
mohsen

Wersja Xcode nie pasuje , rozwiązana za pomocą stackoverflow.com/a/55738882/5443510 .
Jimmy Yin,

Odpowiedzi:


975

Na karcie Ogólne celu znajduje się pole Osadzone pliki binarne . Po dodaniu szkieletu następuje awaria.

Odnośnik znajduje się tutaj na forach programistów Apple.


73
Mam strukturę w osadzonych plikach binarnych i mam również fazę kopiowania ustawioną na „ramy”. W każdym razie ulega awarii.
loretoparisi

11
Rozwiązano to tylko w trybie debugowania. Błąd pojawi się ponownie podczas archiwizacji lub budowy projektu
Saad Ur Rehman,

13
Dodanie @ executable_path / Frameworks do „Runpath Search Path” rozwiązało ten problem, tj. Oprócz dodania frameworka do „Embedded
Binaries

14
Czy ktoś może pomóc w dodawaniu frameworka do osadzonych plików binarnych z urządzeń POD?
Bonnke

3
Tak samo. Chciałbym również wiedzieć, jak dodawać z POD, biorąc pod uwagę, że nie ma „Ogólne> Osadzone binaria” w XCode 6.4 przy użyciu PODS
ded

259

W systemie iOS większym lub równym 8

Pod zakładką Ogólne celu, w sekcji Osadzone pliki binarne dodaj strukturę. Spowoduje to skopiowanie frameworka do skompilowanej, aby można było go połączyć w czasie wykonywania.

wprowadź opis zdjęcia tutaj

Dlaczego to się dzieje? : ponieważ środowisko, do którego się łączysz, jest kompilowane jako środowisko dynamicznie połączone, a zatem jest połączone z środowiskiem uruchomieniowym.

** Uwaga: ** Osadzanie niestandardowych ram jest obsługiwane tylko w systemie iOS> 8, dlatego alternatywne rozwiązanie działa na starszych wersjach systemu iOS.

Na iOS mniej niż 8

Jeśli wpływasz na ten framework (masz dostęp do kodu źródłowego / procesu kompilacji), możesz zmienić ten framework na statyczny, a nie dynamiczny. Spowoduje to, że kod zostanie dołączony do skompilowanej aplikacji, a nie połączony z nią w środowisku wykonawczym, a zatem nie będzie konieczne osadzanie frameworka.

** Jak: ** Na karcie Ustawienia kompilacji środowiska, w sekcji Łączenie zmień Typ Mach-O na Biblioteka statyczna. Odtąd nie trzeba uwzględniać frameworka pod osadzonymi plikami binarnymi.

Ramy statyczne

W tym zasoby: Aby uwzględnić takie rzeczy, jak obrazy, audio lub pliki xib / nib, polecam utworzenie pakietu (zasadniczo katalog, więcej informacji tutaj bit.ly/ios_bundle), a następnie załadowanie zasobów z pakietu za pomocą NSBundle.


1
Jak mogę dodać framework do osadzonych plików binarnych, jeśli framework znajduje się w Pods?
TomazStoiljkovic

Co rozumiesz przez „framework is in Pods”? Czy Twoja niestandardowa platforma jest dystrybuowana za pośrednictwem CocoaPods?
Dawson

2
Powinno to być „Większe niż lub równe 8”. Musiałem to zrobić również na iOS 8.
Cruinh

błądSwift is not supported for static libraries
jose920405

@TomazStoiljkovic wymyśliłeś to? Mam ten sam problem, mam framework, który chcę zbudować jako plik binarny, ale zależy to od innych frameworków za pomocą strąków kakaowych.
MegaManX,

125

Samo przeciągnięcie frameworka do projektu nie będzie wystarczająco dobre. To tak, jakby być na tym samym boisku, ale nie móc znaleźć swoich dzieci. Wykonaj następujące kroki:

1) Utwórz swoją strukturę

  • Rozwiń swoje ramy.
  • Po zakończeniu opracowywania COMMAND+ Bzbuduj platformę i upewnij się, że otrzymasz komunikat „Kompilacja zakończona sukcesem”.

wprowadź opis zdjęcia tutaj

2) Uzyskaj dostęp do swojego frameworka

  • Po pomyślnym skompilowaniu projektu ramowego będzie on gotowy do uzyskania dostępu do Productsfolderu w projekcie.

wprowadź opis zdjęcia tutaj

  • Kliknij prawym przyciskiem myszy .frameworki wybierz „Pokaż w Finderze”.

wprowadź opis zdjęcia tutaj

3) Umieść ramy w swoim projekcie

  • Przeciągnij i upuść .frameworkz okna Findera do folderu „Framework” projektu aplikacji.

wprowadź opis zdjęcia tutaj

4) Skonfiguruj projekt aplikacji dla frameworka

  • Wybierz najwyższy poziom w swoim projekcie

wprowadź opis zdjęcia tutaj

  • Wybierz swój cel

wprowadź opis zdjęcia tutaj

  • Przejdź do „Fazy kompilacji”, a następnie „Połącz plik binarny z bibliotekami” i upewnij się, że Twój framework jest dołączony do wybranych opcjonalnie .

wprowadź opis zdjęcia tutaj

  • Nadal w „Fazach budowy”, przejdź do lewego górnego rogu i wybierz +przycisk. Z rozwijanego menu wybierz „Nowa faza kopiowania plików”.

wprowadź opis zdjęcia tutaj

  • Przewiń w dół do nowej sekcji „Kopiuj pliki” i upewnij się, że ustawiono Destinationopcję „Szkielety”. Pozostaw podścieżkę pustą. Następnie kliknij +przycisk w lewym dolnym rogu.

wprowadź opis zdjęcia tutaj

  • Zostanie przedstawiona hierarchia projektu. Przewiń w dół do folderu „Frameworki”, do którego dodałeś framework w kroku 3, lub wyszukaj go w pasku wyszukiwania u góry. Wybierz swoją strukturę i kliknij „Dodaj”.

wprowadź opis zdjęcia tutaj

  • Upewnij się, że Twoja platforma jest włączona z wybraną opcją „Code Sign On Copy”.

wprowadź opis zdjęcia tutaj

5) Oczyść, a następnie uruchom projekt

  • COMMAND+ SHIFT+K
  • COMMAND+R

5
Słuszna uwaga. To prawie działa dla mnie. Zrobiłem ram A, który inclue Alamofire. Moja aplikacja hosta (embedded framework A) działa w symulatorach. Ale kiedy próbuję uruchomić go na prawdziwym iPhonie, zawiesza się z błędem: Alamofire: dyld: Biblioteka nie załadowana: @ rpath / Alamofire.framework / Alamofire Powód: nie znaleziono odpowiedniego obrazu. Znaleziono: xxx / ddcdemo.app / Frameworks / iddc.framework / Frameworks / Alamofire.framework / Alamofire: mach-o, ale zła architektura
DàChún

1
@Brandon Opcjonalne użycie frameworka rozwiązało mój problem. Ale czy możesz mi wyjaśnić, jakie jest zachowanie opcjonalnego frameworka?
Mitesh Dobareeya,

2
Dziękuję Ci! W kroku 5 zaznaczyłem opcję „Kopiuj tylko podczas instalacji” i to był mój problem.
Andi

48

Stworzyłem framework za pomocą Swift3 / Xcode 8.1 i wykorzystałem go w projekcie Objective-C / Xcode 8.1. Aby rozwiązać ten problem, musiałem włączyć Always Embed Swift Standard Librariesopcję poniżej Build Options.

Spójrz na ten zrzut ekranu:

wprowadź opis zdjęcia tutaj


3
To działało teraz dla mnie w. Rozwiązaniem tego problemu jest, aby przejść do BuildPhases -> Copy Files -> wybierz Framework pod Cel podróży i dodaj swój ramy. Możliwe, że brakuje tutaj Twojej biblioteki.
Harish

@Harish, Proponowane przez Ciebie rozwiązanie jest już sugerowane przez wielu i zdecydowanie zajmę się tym w pierwszym momencie. W moim przypadku ramy zostały tam dodane, ale wciąż pojawiał się ten sam problem. Potem kopię to sam. Jeśli w dół głosowali to rozwiązanie nie wiem dlaczego jesteś całkiem pewien swojej drodze, kiedy to nie działa w moim przypadku: S
NeverHopeless

@Harish Thanks. Twoja odpowiedź pomogła mi znacznie bardziej i oczywiście również NeverHopeless :) Dziękuję wam
Mohsin Khubaib Ahmed

To była jedyna rzecz, która działała dla mnie .. ale już „osadzam” framework w Embedded Binariessekcji mojego celu . Dlaczego to sprawia, że ​​działa?
guptron

Niesamowite, ta rzecz działa, ponieważ przy użyciu szybkiej biblioteki lub zasobnika do osadzenia w projekcie celu C. Projekt celu C często ma tę flagę na nr
Swaroop S

47

Najpierw spróbuj zbudować po Command + Opcja + Shift + K.Jeśli nadal nie powiedzie się, wykonaj poniższe czynności.

Jeśli ktoś napotyka ten błąd w Xcode 8, zmień status frameworka na Opcjonalny zamiast Wymagany w zakładce Ogólne swojego celu.

wprowadź opis zdjęcia tutaj


3
Spowoduje to, że środowisko wykonawcze nie będzie rozpoznawać klas z frameworka
tesla,

@azimov jest poprawny. W tej chwili mam do czynienia z tym dylematem. Wymagany powoduje błąd „nie znaleziono obrazu”, a jeśli spróbujemy ustawić go na opcjonalny, zawiesi się w czasie wykonywania z „nierozpoznanym selektorem”
Adam Mendoza,

1
Chociaż moja ramy był już w link Binaries i ankiety, miałem jeszcze dodać kopię fazę. dyld: Biblioteka nie załadowana: @ rpath / AFNetworking.framework / AFNetworking Odniesienia: / Users / {User} / Library / Developer / CoreSimulator / Devices / 6833A85C-5783-45FA-A4D5-991D286B28C2 / data / Containers / Bundle / Application / B1A0A3B2-92A2-41B0-9884-6DB6995A0D7E / MyApp.app / MyApp Przyczyna: nie znaleziono obrazu (lldb) Rozwiązanie: Projekt -> Cel -> Fazy kompilacji -> + u góry, aby dodać nową fazę Kopiowanie plików Miejsce docelowe = Ramy Wybierz ramy które należy skopiować
Adam Mendoza

@AdamMendoza Odrzuciłem moją aplikację z tego powodu.
jbouaziz

@ jbouaziz, tak, błąd, na który możesz natknąć się, wynika z tego, że plik .framework jest gruby, co oznacza, że ​​ma architektury, które nie są obsługiwane w systemie iOS, takie jak i386 x86_64, oprócz niezbędnego armv7 arm64. Sklep wyświetli komunikat o błędzie, ale błąd Xcode może nie być widoczny. Użyj modułu ładującego w obszarze Xcode -> Otwórz narzędzie programisty -> Moduł ładujący aplikacje. SolutionL sprawia, że ​​jest cienki, patrz -> ikennd.ac/blog/2015/02/...
Adam Mendoza

28

Ten sam problem występuje w wersji iOS 9.x.

PROBLEM JEST: Aplikacja ulega awarii, gdy tylko otworzę aplikację z błędem poniżej.

dyld: Biblioteka nie załadowana: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Odwołuje się od: /var/containers/Bundle/Application/######/TestApp.app/TestApp Powód: nie znaleziono obrazu

Rozwiązałem ten problem, zmieniając Requiredna Optionalw Linked Frameworks and Librariesfor for UserNotifications.frameworkframework.


To działa. Czy ktoś wie dlaczego? Ponieważ niektóre urządzenia potrzebują tego ustawienia, inne nie.
NEO,

Pojawia się komunikat „ostrzeżenie: nie można wykonać kodu pomocniczego do odczytu danych klasy Objective-C w procesie. Może to obniżyć jakość dostępnych informacji o typie”. kiedy oznacz moją lib jako opcjonalną
BergP

zadziałało, może dlatego, że niektóre ramy nie działały w symulatorze, dlatego
Gowtham Sooryaraj,

@ redent84 Ta odpowiedź wraz z twoim komentarzem uratowały mnie przed szaleństwem. Wystąpił ten problem z AuthenticationServices.framework, który wymaga systemu iOS 12.
Tamás Sengel

26

Musiałem ( oprócz tego, co tu wspomniano) dodać następujący wiersz do Ścieżek wyszukiwania Runpath w zakładce Ustawienia kompilacji :
@executable_path/Frameworks

wprowadź opis zdjęcia tutaj


To rozwiązało problem. Problem zacząłem po dodaniu rozszerzenia aplikacji do mojej aplikacji na iOS 9. Przed dodaniem rozszerzenia mój framework był w porządku. Dodanie fazy kompilacji Kopiuj pliki nie pomogło, a ja już osadzałem framework.
Greg

To takie dziwne, że nie jest domyślnie włączone. Jeśli rozpakujesz i spojrzysz na swój IPA, powinieneś znaleźć swoje frameworki w Payloads / appname.app / Frameworks /. Jednak dodanie tej ścieżki wyszukiwania musi istnieć, aby aplikacja mogła przeglądać ten folder w czasie wykonywania. Dziwne.
mattv123

25

Musisz dodać platformę do nowej fazy tworzenia kopii plików, aby upewnić się, że platforma zostanie skopiowana do pakietu aplikacji w czasie wykonywania.

Zobacz Jak dodać „fazę kompilacji Kopiuj pliki” do mojego obiektu docelowego uzyskać więcej informacji, .

Oficjalne dokumenty Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html


Po wypróbowaniu tak wielu rzeczy to właśnie dla mnie to rozwiązało. Miałem już framework w Link Binary i Embed Framework. Nie sądziłem, że muszę dodać fazę kopiowania, ale to naprawiło.
Adam Mendoza,

14

Jeśli używasz Xcode 11 lub nowszego :

  1. Przejdź do ustawień celu i wybierz Ogólne .

Ustawienia docelowe / Ogólne

  1. Przewiń w dół do ram, bibliotek i treści osadzonych .

  2. Upewnij się, że wartość Osadź i podpisz lub Osadź bez podpisu jest wybrana dla opcji Osadź , jeśli to konieczne.

Sekcja Frameworks, Libraries and Embedded Content


13

Dodaj strukturę w osadzonych plikach binarnych wprowadź opis zdjęcia tutaj

Następnie wyczyść i zbuduj.


11

Zaskakujące jest to, że nie wszystkie niezbędne elementy są tutaj udokumentowane, przynajmniej dla Xcode 8.

Mój przypadek był niestandardowym szkieletem w ramach tego samego obszaru roboczego. Okazuje się, że był budowany niepoprawnie. Na podstawie ostatniej odpowiedzi jeremyhu na ten wątek:

https://forums.developer.apple.com/thread/4687

Miałem do zestawu Dynamic Library Install Name Base( DYLIB_INSTALL_NAME_BASE), zgodnie Build Settingsz ramowym projekt, a następnie go odbudować. To było niepoprawnie ustawione $(LOCAL_LIBRARY_DIR)i musiałem to zmienić @rpath.

Tak więc na etapie przetwarzania łącza w App Project instruowała aplikację hosta, aby dynamicznie ładowała platformę w czasie wykonywania z /Library/Frameworks/fw.Framework/fw(jak w katalogu głównym systemu plików środowiska wykonawczego), a nie ze ścieżki do aplikacji/Frameworks/fw.Framework/fw

Jeżeli chodzi o wszystkie inne ustawienia: to ma być w 3 miejscach Build Phases, ale to wszystko jest gotowe od razu po prostu dodać go do Embedded Binariesustawienia zGeneral karcie hostingu aplikacji.

I nie nie trzeba skonfigurować dodatkową Copy Filesfazę, która wydaje się intuicyjnie zbędny w odniesieniu do etapu osadzania tak. Sprawdzając końcowy zapis kompilacji, możemy upewnić się, że nie jest to konieczne.

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[Usunięto wiele pełnych linii, ale wynika to z uproszczonego zapisu w interfejsie użytkownika Xcode.]

Nadal nie mam pojęcia, dlaczego Xcode DYLIB_INSTALL_NAME_BASEnieprawidłowo ustawił dla mnie wartość.


1
Dziękuję, okazało się, że to mój problem w Xcode 11. Importowałem jeden z moich frameworków, który wcześniej działał, ale zacząłem wyświetlać błąd „dyld: Library notload”. Żeby było jasne, chcesz ustawić ustawienie kompilacji „Baza nazw instalacji biblioteki dynamicznej” na „@rpath” w projekcie frameworku, który próbujesz zaimportować, a nie w projekcie, do którego importujesz. Jakoś ustawiony na „/ Library / Frameworks”.
Ben Stahl,

Cieszę się, że było to pomocne 3 lata później. Odpowiednio zredagowane.
BaseZen,

9

W moim przypadku rozwiązaniem było usunięcie skompilowanej struktury z osadzonych plików binarnych, która była samodzielnym projektem w obszarze roboczym, wyczyszczenie i przebudowanie go, a na końcu ponowne dodanie do osadzonych plików binarnych.


8

Moje środowisko: Cocos2d 2.0, Box2d, Cel C

Oprócz wykonania innych odpowiedzi powyżej, w końcu poszedłem do zakładki Ogólne i ustawiłem WatchKit jako opcjonalny.

Docelowe ogólne połączone ramy i biblioteki Watchkit.framework Opcjonalne


8

Jeśli używasz frameworka innej firmy i używasz Cocoapods jako menedżera zależności, spróbuj pod installodświeżyć swoje kapsułki.

Ta awaria miała miejsce w bibliotece innej firmy, z której korzystałem, więc cieszę się, że powyższe rozwiązanie działało dla mnie, mam nadzieję, że zadziała dla Ciebie!


1
Świetny! naprawiono mój problem. Ale czy można w jakiś sposób uniknąć instalowania zależności pod w mojej aplikacji hosta?
DàChún

8

wprowadź opis zdjęcia tutaj

Rozwiązano dla mnie, odznaczając opcję „Kopiuj tylko po zainstalowaniu” w Fazach kompilacji-> Osadź ramy


1
Dobrze byłoby znać sens tego pola wyboru, jeśli system nie uważa, że ​​„instalacja debugowania” nie jest „instalacją”. Niezależnie od tego, jeśli spowoduje to awarię aplikacji na sprzęcie, zamiast uniemożliwić uruchomienie aplikacji z ostrzeżeniem, jest to kolejna wada Xcode
William Cerniuk

8

Jest to błąd czasu wykonywania spowodowany przez Dynamic Linker

dyld: Library not loaded: @rpath/...
...
Reason: image not found

Błąd Library not loadedz @rpathwskazuje, że Dynamic Linkernie można znaleźć pliku binarnego.

  1. Sprawdź, czy dodano ramy dynamiczne General -> Embedded Binaries

  2. Sprawdź @rpathkonfigurację między konsumentem (aplikacją) a producentem (dynamiczne środowisko):

    • Dynamiczne ramy:
      • Build Settings -> Dynamic Library Install Name
    • Podanie:
      • Build Settings -> Runpath Search Paths
      • Build Phases -> Embed Frameworks -> Destination, Subpath

Dynamiczny linker

Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)który jest używany przez loadable bundle( Dynamic frameworkjako pochodną), gdzie dyldwchodzi w grę
Dynamic Library Install Name- ścieżka do pliku binarnego (nie .framework). Tak, mają taką samą nazwę, ale MyFramework.frameworkjest packaged bundlezMyFramework pliku binarnego i zasobów wewnątrz.
Ta ścieżka katalogu mogą być bezwzględne lub względne (np @executable_path, @loader_path, @rpath). Ścieżka względna jest bardziej preferowana, ponieważ jest zmieniana wraz z kotwicą, która jest przydatna, gdy dystrybuujesz swój pakiet jako pojedynczy katalog

ścieżka absolutna - przykład Framework1

//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1

@executable_path

@executable_path - względem wejścia binarnego - Framework2 Przykład
użycia : osadzenie a Dynamic frameworkw aplikacji

//Application bundle(`.app` package) absolute path
/some_path/Application.аpp

//Application binary absolute path 
/some_path/Application.аpp/subfolder1

//Framework2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

//Framework2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework2 Dynamic Library Install Name 
@executable_path/../Frameworks/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
/some_path/Application.аpp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

@loader_path

@ loader_path - w stosunku do pakietu, który jest właścicielem tego binarnego
przypadku użycia: framework z osadzonym frameworkiem - Framework3_1 z Framework3_2 wewnątrz

//Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1

//Framework3_2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1

//Framework3_1 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework3_1 @loader_path == Framework3_1 @executable_path
/some_path/Application.аpp/subfolder1

//Framework3_2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1

//Framework3_2 @loader_path == Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1

//Framework3_2 Dynamic Library Install Name 
@loader_path/../Frameworks/Framework3_2.framework/subfolder1

//Framework3_2 binary resolved absolute path by dyld
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1

@rpath - Ścieżka wyszukiwania Runpath

Framework2Przykład

Wcześniej musieliśmy skonfigurować Framework do pracy z dyld. Nie jest to wygodne, ponieważ ten sam Framework nie może być używany z różnymi konfiguracjami

@rpath jest złożoną koncepcją opartą na częściach zewnętrznych (Aplikacja) i zagnieżdżonych (Dynamiczne środowisko):

  • Podanie:

    • Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS) - określa listę szablonów, które można zastąpić @rpath .
       @executable_path/../Frameworks
    • Sprawdź, czy Build Phases -> Embed Frameworks -> Destination, Subpathchcesz znaleźć dokładnie miejsce osadzenia
  • Dynamic Framework:

    • Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)- punkt @rpathużywany razem z lokalną ścieżką pakietu do pliku binarnego
      @rpath/Framework2.framework/subfolder1
//Application Runpath Search Paths
@executable_path/../Frameworks

//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1

//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1

*../ - przejdź do rodzica bieżącego katalogu

otool - narzędzie do wyświetlania plików obiektowych

//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2

//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2

//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

LC_RPATH
@executable_path/../Frameworks

//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2

install_name_tool zmień nazwy instalacji dynamicznej biblioteki współużytkowanej za pomocą -rpath

CocoaPodsużywa use_frameworks![Informacje] do regulowaniaDynamic Linker

[Słownictwo]


6

Ostatnio natknąłem się na ten problem z importowaniem CoreNFC na starszych telefonach (np. IPhone 6) i Xcode (11.3.1). Udało mi się sprawić, żeby to zadziałało

  1. W swoich projektach wybierz cel.
  2. Idź do zakładki Ogólne u góry.
  3. W sekcji „ Frameworks, Libraries and Embedded Content ” dodaj framework (dla mnie był to CoreNFC). Powtórz dla innych celów.
  4. Kliknij opcję Kompiluj fazy u góry i rozwiń pozycję „ Połącz plik binarny z bibliotekami” ”.
  5. Ustaw problematyczną ramę jako opcjonalną (z wymaganych).

To pozwoliło mi skompilować dla starszych / nowszych iPhone'ów bez wprowadzania jakichkolwiek zmian w kodzie. Mam nadzieję, że to pomaga innym.


1
DZIĘKUJĘ CI. Opcjonalne było brakujące ogniwo ...
fl034

nie działa, aplikacja ulega awarii i nie ma komunikatu wskazującego typ awarii zamiast punktu przerwania w jakimś kodzie zestawu.
Newsonic

dlaczego jest to konieczne, aby uczynić opcjonalnym?
rohitwtbs

5

Miałem ten sam problem. Próbowałem zbudować swój projekt na iPhonie, którego nigdy wcześniej nie używałem i nie dodałem nowego frameworka. Dla mnie sprzątanie działało dobrze ( Shift + Command + K ). Może to dlatego, że używam wersji beta Xcode 7 i iPhone'a 6 z iOS 9 Beta, ale działało.


A może też folder Clean Build (CMD + Shift + Alt + K)
Grifas

4

W moim przypadku mój projekt jest napisany przez cel-c, aw bibliotece znajdują się pliki Swift. Dlatego zmieniłem „Zawsze osadzaj szybkie biblioteki standardowe” na karcie Ustawienia kompilacji mojego projektu na Tak i stało się to całkowicie w porządku.


4

W przypadku każdego projektu lub projektu Framework w Xcode, które używają zasobników, jednym z łatwych sposobów uniknięcia ładowania biblioteki dynamicznej (dylb) jest ustawienie pliku zasobnika na atrament w trybie statycznym. Aby to zrobić, pamiętaj, aby nie zapisywać następującego wiersza w pliku pod.

use_frameworks!

Po usunięciu wiersza z zapisanego pliku wystarczy uruchomić z konsoli:

$ pod update

2

Jeśli masz programistę Pod usuń aplikację z symulatora instalacji z pod -> wyczyść -> uruchom ponownie ...


2

Tak samo było, gdy stworzyłem nowy schemat konfiguracji i kompilacji.

Więc rozwiązaniem było dla mnie uruchomienie

pod install

dla tej nowo utworzonej konfiguracji.


1

Po wypróbowaniu wszystkich metod dostępnych w Internecie i moich 100 prób prób i błędów. W końcu udało mi się to rozwiązać. - Apeksha Sahu 6 minut temu
Przejdź do iTunes na Macu -> konta -> Autoryzuj ten komputer - Apeksha Sahu 5 minut temu
drugi krok .... Przejdź do dewelopera w ustawieniach na iPadzie i iPhonie i ponownieindeksuj z identyfikatorami i wyczyść wszystko komputery zaufania. To działało dla mnie ........ ....... Po ponownej instalacji Mac OSHigh seria 10.13.15 wersja z najnowszej wersji Mac OS seirra beta, do ponownej instalacji najnowszej wersji Xcode, po zaktualizowaniu wszystkich certyfikatów. etc etc etc ... tyle metod, ile możesz sobie wyobrazić. -wprowadź opis zdjęcia tutaj


1

Spróbuj zmienić flagę ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES(we wcześniejszych wersjach xcode:) Embedded Content Contains Swift Codew Ustawieniach kompilacji z NIE na TAK.


1

Xcode 11

  1. Przejdź do ustawień celu i wybierz Ogólne.
  2. Wyszukaj „Frameworki, biblioteki i treści osadzone”
  3. Zachowaj „Nie osadzaj” i upewnij się, że wszystkie cele (jeśli masz więcej niż jeden) mają tylko własne ramy, a nie inne cele.

1

W Xcode 11

Miałem do czynienia z tym samym problemem

Zmiana „Nie osadzaj” na karcie Ogólne > „Szkielety, biblioteki i treści osadzone” nadal powodowała ten sam błąd.

Rozwiązałem dla mnie dodanie frameworka w zakładce Fazy kompilacji > sekcja Osadzanie frameworków

- Zaktualizowano ---

Zauważyłem to w projektach zbudowanych w poprzednich wersjach Xcode Embed Frameworks nie jest dostępna podczas uruchamiania w Xcode 11, Znajdź poniższe kroki, aby osiągnąć rozwiązanie:

1: Najpierw musisz dodać nową fazę kopiowania plików w zakładce Fazy ​​kompilacji .

wprowadź opis zdjęcia tutaj

2: Po drugie zmień nazwę dodanej fazy na Embed Frameworks wprowadź opis zdjęcia tutaj

3: Zmień miejsce docelowe na Frameworki .

wprowadź opis zdjęcia tutaj

4: Dodaj strukturę, dla której wystąpił błąd.

wprowadź opis zdjęcia tutaj


1

Chociaż wszyscy mówią, aby osadzić platformę pod osadzonymi plikami binarnymi, ale nadal nie działa, ponieważ brakuje nam tutaj jednego ważnego kroku.

Oto dwa właściwe kroki, aby dodać pliki binarne na karcie Osadzone pliki binarne:

  1. Usuń platformę, która powoduje błąd z „Połączonych ram i bibliotek” na karcie Ogólne.

  2. Teraz dodaj usuniętą strukturę tylko na karcie Osadzone pliki binarne i to wszystko, co trzeba zrobić.

Uruchom go na urządzeniu i zachowaj ten uśmiech;)


0
  1. Przejdź do pliku w xcode -> Ustawienia obszaru roboczego
  2. Kliknij strzałkę obok przycisku / Users / apple / Library / Developer / Xcode / DerivedData
  3. Wybierz Pochodne dane i przenieś je do Kosza.
  4. Zamknij xcode i otwórz go ponownie.
  5. Oczyść projekt i uruchom ponownie.

Powyższe kroki rozwiązały moje problemy.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.