Xcode 4 nie może zlokalizować publicznych plików nagłówkowych z zależności od biblioteki statycznej

91

Alternatywne tytuły ułatwiające wyszukiwanie

  • Xcode nie może znaleźć nagłówka
  • Brak .h w Xcode
  • Nie znaleziono pliku Xcode .h
  • Nie znaleziono pliku problemu leksykalnego lub preprocesora

Pracuję nad projektem aplikacji na iOS, który pochodzi z Xcode 3. Teraz przeniosłem się do Xcode 4, mój projekt buduje kilka statycznych bibliotek.

Te biblioteki statyczne również deklarują nagłówki publiczne, a te nagłówki są używane przez kod aplikacji. W Xcode 3.x nagłówki zostały skopiowane (jako faza kompilacji) do pliku public headers directory, a następnie w projekcie aplikacji public headers directorydodano do pliku headers search list.

W Xcode 4 katalog kompilacji jest przenoszony do ~/Library/Developer/Xcode/DerivedData/my-project.

Problem polega na tym, jak mam odwołać się do tej nowej lokalizacji w ustawieniach wyszukiwania nagłówków? Wygląda na to że:

  • public headers directory odnosi się do DerivedData katalogu, ale
  • headers search katalog jest powiązany z czymś innym (prawdopodobnie lokalizacja projektu)

Jak ustawić docelową bibliotekę statyczną na potrzeby programowania systemu iOS w Xcode 4, która zapewni, że pliki nagłówkowe będą dostępne dla klientów korzystających z biblioteki statycznej podczas próby kompilacji jako zależności?

Richard Stelling
źródło
Może być powiązany z nazwami ścieżek. Pl sprawdź ten post. [Biblioteki statyczne w Xcode 4] [1] [1]: stackoverflow.com/questions/6074576/static-libraries-in-xcode-4/…
Diego Marafetti

Odpowiedzi:

124

Każde z rozwiązań tego problemu, które widziałem, wydawało mi się albo nieeleganckie (kopiowanie nagłówków do projektu aplikacji) lub nadmiernie uproszczone do tego stopnia, że ​​działają tylko w trywialnych sytuacjach.

Krótka odpowiedź

Dodaj następującą ścieżkę do ścieżek wyszukiwania nagłówków użytkownika

„$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts”

Dlaczego to działa?

Najpierw musimy zrozumieć problem. W normalnych okolicznościach, to znaczy podczas uruchamiania, testowania, profilowania lub analizowania, Xcode buduje projekt i umieszcza dane wyjściowe w katalogu Build / Products / Configuration / Products, który jest dostępny za pośrednictwem $ BUILT_PRODUCTS_DIR makra .

Większość poradników dotyczących bibliotek statycznych zaleca ustawienie ścieżki do folderu nagłówków publicznych na $ TARGET_NAME , co oznacza, że ​​plik lib staje się $ BUILT_PRODUCTS_DIR /libTargetName.a, a nagłówki są umieszczane w $ BUILT_PRODUCTS_DIR / TargetName. Dopóki Twoja aplikacja zawiera $ BUILT_PRODUCTS_DIR w swoich ścieżkach wyszukiwania, import będzie działał w 4 sytuacjach podanych powyżej. Jednak to nie zadziała podczas próby archiwizacji.

Archiwizacja działa trochę inaczej

Podczas archiwizowania projektu Xcode używa innego folderu o nazwie ArchiveIntermediates. W tym folderze znajdziesz / YourAppName / BuildProductsPath / Release-iphoneos /. To jest folder, na który wskazuje $ BUILT_PRODUCTS_DIR podczas archiwizacji. Jeśli zajrzysz tam, zobaczysz, że istnieje dowiązanie symboliczne do zbudowanego pliku biblioteki statycznej, ale brakuje folderu z nagłówkami.

Aby znaleźć nagłówki (i plik lib), musisz przejść do IntermediateBuildFilesPath / UninstalledProducts /. Pamiętasz, kiedy powiedziano ci, aby ustawić opcję Pomiń instalację na TAK dla bibliotek statycznych? Taki jest efekt, jaki ma ustawienie podczas tworzenia archiwum.

Uwaga dodatkowa: jeśli nie ustawisz opcji pomijania instalacji, nagłówki zostaną umieszczone w jeszcze innej lokalizacji, a plik lib zostanie skopiowany do archiwum, uniemożliwiając eksport pliku .ipa, który można przesłać do App Store .

Po wielu poszukiwaniach nie udało mi się znaleźć żadnego makra, które dokładnie odpowiada folderowi UninstalledProducts, stąd potrzeba skonstruowania ścieżki z „$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts”

Podsumowanie

W przypadku biblioteki statycznej upewnij się, że pomijasz instalację i że Twoje publiczne nagłówki są umieszczone w $ TARGET_NAME.

W przypadku aplikacji ustaw ścieżki wyszukiwania nagłówków użytkownika na „$ (BUILT_PRODUCTS_DIR)”, co działa dobrze w przypadku zwykłych kompilacji, oraz na „$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts”, co działa w przypadku kompilacji archiwalnych.

Colin
źródło
Jak to się ma do folderu DerivedData?
Richard Stelling
Zwykłe kompilacje przechodzą do: DerivedData / WorkspaceName-hash / Build / Products / Debug-iphoneos / TargetName.app --- Kompilacje archiwalne idą do: DerivedData / WorkspaceName-hash / Build / Intermediates / ArchiveIntermediates / TargetName / BuildProductsPath / Release -os / TargetName.app
Colin
3
U mnie nie działało używanie „$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts” z rekurencyjnym polem wyboru. Jak tylko użyłem "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / <nameOfStaticLibrary>" bez flagi rekurencyjnej, zadziałało to dla mnie.
TPoschel
7
Zauważ, że twój $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts jest w rzeczywistości $(TARGET_BUILD_DIR). Nawet podczas archiwizacji. ;)
Pascal
1
Dla mnie w Xcode 5: $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / include / NAME OF LIBRARY Nie ustawiłem na TAK: Zawsze przeszukuj ścieżki użytkowników.
xarly
85

Napotkałem ten sam problem podczas opracowywania własnej biblioteki statycznej i chociaż odpowiedź Colina była bardzo pomocna, musiałem ją nieco zmodyfikować, aby działał spójnie i prosto, zarówno podczas uruchamiania, jak i archiwizowania projektów w Xcode 4 przy użyciu Workspace.

Różnica w mojej metodzie polega na tym, że możesz użyć pojedynczej ścieżki nagłówka użytkownika dla wszystkich konfiguracji kompilacji.

Moja metoda jest następująca:

Utwórz obszar roboczy

  1. W Xcode 4 przejdź do File, New, Workspace.
  2. Z Findera możesz następnie przeciągnąć projekty .xcodeproj zarówno dla biblioteki statycznej, której chcesz użyć, jak i nowej budowanej aplikacji, która korzysta z tej biblioteki. Więcej informacji na temat konfigurowania obszarów roboczych można znaleźć w Dokumentach Apple: https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

Ustawienia projektu biblioteki statycznej

  1. Upewnij się, że wszystkie nagłówki biblioteki statycznej są ustawione na kopiowanie jako „Publiczne”. Odbywa się to w ustawieniach docelowej biblioteki statycznej> Fazy kompilacji. Na etapie „Kopiuj nagłówki” upewnij się, że wszystkie nagłówki znajdują się w sekcji „Publiczne”.
  2. Następnie przejdź do Ustawień kompilacji, znajdź „Ścieżkę folderu nagłówków publicznych” i wpisz ścieżkę do swojej biblioteki. Wybieram to:

include / LibraryName

Zaadoptowałem to z RestKit i stwierdziłem, że działa najlepiej ze wszystkimi moimi bibliotekami statycznymi. To powoduje, że Xcode ma skopiować wszystkie nagłówki, które przenieśliśmy do sekcji nagłówków „Publiczne” w kroku 1, do określonego tutaj folderu, który znajduje się w folderze Pochodne dane podczas budowania. Podobnie jak w przypadku RestKit, lubię używać pojedynczego folderu „include” do przechowywania każdej biblioteki statycznej, której używam w projekcie.

Nie podoba mi się również używanie tutaj makr, ponieważ pozwoli nam to później użyć pojedynczej ścieżki wyszukiwania nagłówka użytkownika, gdy konfigurujemy projekt za pomocą biblioteki statycznej.

  1. Znajdź opcję „Pomiń instalację” i upewnij się, że jest ustawiona na TAK.

Ustawienia projektu korzystającego z biblioteki statycznej

  1. Dodaj bibliotekę statyczną jako strukturę w obszarze Fazy kompilacji> Połącz plik binarny z bibliotekami i dodaj plik libLibraryName.a dla dowolnej biblioteki statycznej, której chcesz użyć.
  2. Następnie upewnij się, że projekt jest ustawiony na wyszukiwanie ścieżek wyszukiwania użytkowników. Odbywa się to w Ustawieniach kompilacji> Zawsze przeszukuj ścieżki użytkownika i upewnij się, że jest ustawiony na TAK.
  3. W tym samym obszarze znajdź ścieżki wyszukiwania nagłówków użytkownika i dodaj:

    „$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include”

To mówi Xcode, aby szukał bibliotek statycznych w pośrednim folderze kompilacji, który Xcode tworzy podczas procesu kompilacji. Tutaj mamy folder „include”, którego używamy do lokalizacji naszych bibliotek statycznych, które konfigurujemy w kroku 2 dla ustawień projektu biblioteki statycznej. Jest to najważniejszy krok w uzyskaniu Xcode, aby poprawnie znaleźć biblioteki statyczne.

Skonfiguruj obszar roboczy

Tutaj chcemy skonfigurować obszar roboczy tak, aby podczas budowania naszej aplikacji budował bibliotekę statyczną. Odbywa się to poprzez edycję schematu używanego w naszej aplikacji.

  1. Upewnij się, że masz wybrany schemat, który utworzy Twoją aplikację.
  2. Z listy rozwijanej schematu wybierz Edytuj schemat.
  3. Wybierz opcję Kompiluj u góry listy po lewej stronie. Dodaj nowy cel, naciskając + na środkowym panelu.
  4. Powinna pojawić się biblioteka statyczna dla biblioteki, którą próbujesz połączyć. Wybierz bibliotekę statyczną iOS.
  5. Kliknij Uruchom i Archiwizuj. Informuje to schemat, aby kompilował biblioteki dla biblioteki statycznej za każdym razem, gdy tworzysz aplikację.
  6. Przeciągnij bibliotekę statyczną powyżej celu aplikacji. To sprawia, że ​​biblioteki statyczne są kompilowane przed celem aplikacji.

Zacznij korzystać z biblioteki

Teraz powinieneś być w stanie zaimportować swoją bibliotekę statyczną za pomocą

import <LibraryName/LibraryName.h>

Ta metoda pozwala uniknąć kłopotów związanych z koniecznością posiadania różnych ścieżek nagłówka użytkownika dla różnych konfiguracji, więc nie powinno być problemu z kompilacją dla archiwów.

Dlaczego to działa?

Wszystko zależy od tej ścieżki:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

Ponieważ konfigurujemy naszą bibliotekę statyczną do korzystania z opcji „Pomiń instalację”, skompilowane pliki są przenoszone do folderu „UninstalledProjects” w tymczasowym katalogu kompilacji. Nasza ścieżka w tym miejscu również prowadzi do folderu „include”, który skonfigurowaliśmy dla naszej biblioteki statycznej i używamy jako ścieżki wyszukiwania nagłówka użytkownika. Dzięki tej współpracy Xcode wie, gdzie znaleźć naszą bibliotekę podczas procesu kompilacji. Ponieważ ten tymczasowy katalog kompilacji istnieje dla konfiguracji debugowania i wydania, potrzebujesz tylko jednej ścieżki dla Xcode do wyszukiwania bibliotek statycznych.

gdavis
źródło
3
Jesteś niesamowity, stary! Jest to bardzo pomocne i działa zgodnie z opisem.
neevek
1
niesamowite. Gdzie mam wysłać kwiaty :)
Ramesh
1
Po skonfigurowaniu tego, niektórzy z was mogą napotkać „ ...] nierozpoznany selektor wysłany do klasy 0x ... ”. Jeśli tak, spróbuj dodać to do Celów projektu- > Projekt-> Ustawienia kompilacji-> Łączenie-> Inne flagi konsolidatora
MkVal
Upewnij się, że ścieżki wyszukiwania nagłówków użytkownika są w cudzysłowach, jeśli mają spacje.
respekt TheCode,
Xcode 4.6.2 nie zapisuje niczego w „$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include” dla mnie. Masz jakiś pomysł, czego mi brakuje? A może ponownie zmieniło się zachowanie Xcode?
c roald
16

Projekt Xcode 4 nie może skompilować biblioteki statycznej

Powiązane pytanie: „Nie znaleziono pliku problemu leksykalnego lub preprocesora” w Xcode 4

Błędy mogą obejmować; brakujące pliki nagłówkowe, „problem leksykalny lub preprocesor”

Rozwiązania:

  1. Sprawdź, czy „ścieżki nagłówka użytkownika” są poprawne
  2. Ustaw „Zawsze wyszukuj ścieżki użytkowników” na TAK
  3. Utwórz połączenie grupowe „Indeksowanie nagłówków” w swoim projekcie i przeciągnij nagłówki do tej grupy. NIE dodawaj do żadnych celów po wyświetleniu monitu.
Richard Stelling
źródło
11
Kolejny łatwy do przeoczenia, ale niezwykle ważny krok: upewnij się, że ścieżki wyszukiwania są ujęte w podwójne cudzysłowy, aby uniknąć spacji. Zawsze o tym zapominam.
Brad
Dzięki @Brad, to jest rzeczywiście bardzo ważna i pomocna uwaga.
Julian D.
15

To był bardzo pomocny wątek. Poszukując mojej własnej sytuacji, odkryłem, że Apple ma 12-stronicowy dokument z września 2012 r. Zatytułowany „Korzystanie z bibliotek statycznych w iOS”. Oto link do pliku PDF: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf

Jest to znacznie prostsze niż większość dyskusji w Internecie, a dzięki niewielkim modyfikacjom uwzględniającym konfigurację bibliotek zewnętrznych, których używam, działa dobrze dla mnie. Najważniejsza część to prawdopodobnie:

Jeśli docelowa biblioteka ma fazę kompilacji „Kopiuj nagłówki”, należy ją usunąć; Fazy ​​kompilacji kopiowania nagłówków nie działają poprawnie z docelowymi bibliotekami statycznymi podczas wykonywania akcji „Archiwizuj” w Xcode.

Nowe obiekty docelowe bibliotek statycznych utworzone za pomocą Xcode 4.4 lub nowszego będą zawierały odpowiednio skonfigurowaną fazę kopiowania plików dla nagłówków, dlatego przed utworzeniem należy sprawdzić, czy już go masz. Jeśli tego nie zrobisz, naciśnij „Dodaj fazę budowy” u dołu edytora docelowego i wybierz „Dodaj kopiowane pliki”. Ujawnij nową fazę kompilacji Kopiuj pliki i ustaw Miejsce docelowe na „Katalog produktów”. Ustaw ścieżkę podrzędną do uwzględnienia / $ {PRODUCT_NAME}. Spowoduje to skopiowanie plików do folderu o nazwie zgodnej z Twoją biblioteką (pobranego z ustawienia kompilacji PRODUCT_NAME), w folderze o nazwie include, w katalogu produktów zbudowanych. Folder include w katalogu produktów do kompilacji znajduje się w domyślnej ścieżce wyszukiwania nagłówka dla aplikacji, więc jest to odpowiednie miejsce do umieszczania plików nagłówkowych.

Jestem pewien, że w wielu istniejących sytuacjach podejście Apple'a może nie wystarczyć. Publikuję to tutaj dla każdego, kto dopiero zaczyna swoją podróż po statycznej ścieżce ogrodowej biblioteki - może to być najlepszy punkt wyjścia dla prostych przypadków.

Michael J.
źródło
dla tych, którzy podążają za powyższym linkiem .. uwaga: krok, który prosi o usunięcie fikcyjnych plików szablonów podczas tworzenia projektu biblioteki .. NIE USUWAJ pliku * .pch .. w końcu cię prześladuje + powyższe rada nie działa z kategoriami .. jest jednak na to poprawka (gdzieś to widziałem)
abbood
Dziękujemy za udostępnienie łącza do oficjalnego podejścia Apple do tworzenia bibliotek statycznych. Zacząłem od zbudowania mojej biblioteki statycznej przy użyciu tego podejścia , ale nie mogłem zarchiwizować. @abbood - Jaki jest problem z usuwaniem wygenerowanego pliku PCH?
augusto callejas
jeśli usuniesz plik .pch ... projekt po prostu się nie skompiluje ... (w celu archiwizacji lub w inny sposób) ..
abbood
To nie działa dla mnie. Kiedy próbuję zaimportować instrukcję z "", nie działa, potrzebuję <>. Również podczas archiwizacji nie jest w stanie znaleźć nagłówków. Jakieś pomysły?
user1010819
4

http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html

Dokumentacja według Apple:

Twoja biblioteka będzie miała jeden lub więcej plików nagłówkowych, które klienci tej biblioteki będą musieli zaimportować. Aby skonfigurować, które nagłówki mają być eksportowane do klientów, wybierz projekt biblioteki, aby otworzyć edytor projektów, wybierz docelową bibliotekę, aby otworzyć edytor docelowy, i wybierz kartę Fazy kompilacji. Jeśli docelowa biblioteka ma fazę kompilacji „Kopiuj nagłówki”, należy ją usunąć; Fazy ​​kompilacji kopiowania nagłówków nie działają poprawnie z docelowymi bibliotekami statycznymi podczas wykonywania akcji „Archiwizuj” w Xcode.

dmarnel
źródło
3

Spójrz na rozwiązanie Jonaha Wlliama (w połowie drogi) i model GitHub (w komentarzach), aby uzyskać wgląd. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

d1bru
źródło
4
Chociaż może to technicznie odpowiadać na pytanie, lepiej byłoby, gdybyś zawarł w odpowiedzi najważniejsze części połączonego artykułu i podał link do odniesienia. W przeciwnym razie odpowiedź jest zagrożona gniciem linków.
jscs
2

Dodaj $ (OBJROOT) / UninstalledProducts / exactPathToHeaders do ścieżek wyszukiwania nagłówków.

Z jakiegoś powodu rekursywne pole wyboru nie zadziałało i musiałem dodać resztę ścieżki do miejsca, w którym znajdują się nagłówki.

W Nawigatorze dziennika w Xcode (karta po prawej stronie nawigatora punktów przerwania) można zobaczyć historię kompilacji. Jeśli wybierzesz faktyczny błąd kompilacji, możesz rozwinąć jego szczegóły, aby zobaczyć ścieżkę setenv i sprawdzić, czy istnieje ścieżka do plików nagłówkowych.

Collin
źródło
Dobra uwaga na rekurencyjnym polu wyboru, ten sam problem tutaj.
Codezy
Tak, musiałem również określić konkretny podfolder, sprawdzanie rekurencji nie działało.
Oliver Pearmain
Skończyło się jednak na korzystaniu z tej ścieżki (po prostu dlatego, że jest krótsza) „$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / SubProjectHeaders”
Oliver Pearmain
2

Żadna z powyższych odpowiedzi nie działała dla mnie w Xcode 7, ale dali mi dobry pomysł. Dla facetów zmagających się z Xcode 7, naprawiłem to, dodając następujące elementy do ścieżek wyszukiwania nagłówka użytkownika (w tym cudzysłowy)

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

Zmień względną część adresu URL usr/local/includezgodnie z ustawieniem „Ścieżka do folderu publicznego nagłówka” biblioteki statycznej

Evol Gate
źródło
2

W moim przypadku mój obszar roboczy miał kilka projektów bibliotek statycznych, a jeden z nich ma zależność obejmującą pliki nagłówkowe z drugim. Problem dotyczył kolejności budowy. Na stronie edycji schematu w sekcji Kompiluj, odznaczyłem opcję zrównoleglenia i ustawiłem kolejność celów zgodnie z zależnościami i rozwiązałem problem

Vamshi
źródło
1

Dodaj następującą ścieżkę do ścieżek wyszukiwania nagłówków użytkownika :

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

To jest zweryfikowane!

yirenjun
źródło
1

Ryzykując, że pokażę, jakim jestem idiotą ... Cierpiałem na to, że XCode odmawiał znalezienia moich plików .h przez całe popołudnie.

Wtedy zrozumiałem.

Ponieważ używałem „XCode 4”, „inteligentnie” zdecydowałem się umieścić wszystkie moje projekty w podfolderach folderu o nazwie „ Projekty XCode 4 ”.

Te spacje w nazwie folderu zawiodły XCode na wielką skalę!

Zmiana nazwy tego folderu na „ XCode_4_Projects ” przyniosła radość (i mniej przekleństw) z powrotem do mojego życia.

Przypomnij mi jeszcze raz, który to rok?

Być może ktoś mógłby powiedzieć programistom Apple ...

Mike Gledhill
źródło
1

Żadna z tych odpowiedzi nie zadziałała dla mnie. Oto, co zrobił. Dodaj dokładnie (kopiuj i wklej, w tym cudzysłowy) do ustawienia kompilacji ścieżek wyszukiwania nagłówka użytkownika :

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

Zwróć uwagę na dodanie podkatalogu „/ include /” w porównaniu z innymi odpowiedziami. Jak zauważyli inni użytkownicy, opcja „rekurencyjna” wydaje się nic nie robić, więc możesz ją zignorować.

Mój projekt był teraz w stanie pomyślnie zarchiwizować podczas importowania plików nagłówkowych bibliotek statycznych w następującej formie:

#import "LibraryName/HeaderFile.h"

Zdajesz nie trzeba włączyć Zawsze ścieżek wyszukiwania użytkownika ustawienia, jeśli nie jesteś w tym swoje statycznych nagłówków bibliotek z nawiasów trójkątnych ( #import <LibraryName/HeaderFile.h>), ale na pewno nie należy robić to w ten sposób w każdym razie, jeśli nie jest to nagłówek systemu / ramy.

devios1
źródło
0

Jest to powiązany problem, który doprowadził mnie do tego pytania, więc dodaję moje rozwiązanie stricte dokumentacyjne / może zaoszczędzić kolejne godziny pocenia się duszy

Nie znaleziono pliku DropboxSDK.h

Po wielu dniach prób skompilowania VES dla iOS w końcu napotkałem ten problem. DropboxSDK.hbył zdecydowanie w miejscu niedostępnym search headersnawet dodaje go do framework headersścieżki wyszukiwania, includeD .hbezpośrednio i udał się do wszelkich starań, aby spróbować i dostać DropboxSDK.hznaleźć.

Rozwiązanie

EXPLICITY przeciągnij DropboxSDK.frameworkplik do Xcode Project Navigationi upewnij się, że Copy Files if neededjest zaznaczony. Upewnij się również, że cel jest zaznaczony w razie potrzeby.

Ostrzeżenie

Ustawienie jawnej lokalizacji szkieletu w build phasesnie działa dla mnie. Musiałem przeciągnąć .framework do Xcode i upewnić się, że pliki zostały skopiowane do mojego projektu.

# mbp2015 # xcode7 # ios9

Jacksonkr
źródło
0

Można to zrobić na wiele złożonych sposobów, aw tym wątku zaproponowano kilka bardzo inteligentnych rozwiązań.

Głównym problemem wszystkich tych rozwiązań jest to, że poważnie zmniejszają one przenośność biblioteki.

  • Za każdym razem, gdy musisz rozpocząć nowy projekt przy użyciu swojej biblioteki i zarchiwizować go dla iTunes, jest to piekło konfiguracji.
  • Za każdym razem, gdy musisz udostępnić swój projekt zespołowi lub klientom, może się on zepsuć z dowolnego powodu (kontekst, wersja Xcode, cokolwiek, ...)

Ostatecznie zdecydowałem się po prostu używać frameworków - zawsze - zgodnie z zaleceniami Apple (WWDC Videos).

To jest o wiele łatwiejsze i na końcu robi to samo!

Innym dość eleganckim rozwiązaniem, które wydaje się działać, jest użycie Private Cocoapods. Cocoapods wykonuje całą pracę konfiguracyjną, kopiuje nagłówek i tak dalej.

Rockowe ramy!

Łoś
źródło
1
Gdzie to ustawiasz? simply use frameworks - always -
Neil Faulkner
To nie jest nigdzie ustawione. To po prostu wybór architektoniczny. Struktury to „nowoczesne biblioteki”, które są znacznie łatwiejsze do łączenia i zarządzania. W chwili pojawienia się tej wiadomości, swift nadal nie pozwala na tworzenie bibliotek binarnych.
Łoś
0

Oto, co rozwiązało ten sam problem dla mnie.

Mam cel aplikacji i miejsce docelowe rozszerzenia iMessage. Następnie miałem 2 zestawy SDK (własne), z którymi łączy się cel aplikacji.

Problem polegał na tym, że mój cel iMessage również używał moich 2 SDK (oddzielnych projektów), ale nie łączył się z nimi w Fazach kompilacji -> Połącz plik binarny z bibliotekami. Musiałem dodać moje 2 SDK do iMessage Target tam, aby dopasować mój cel aplikacji, a teraz jest archiwizowany.

Zatem morał tej historii jest następujący: jeśli masz wiele celów, takich jak rozszerzenia, upewnij się, że wszystkie cele mają linki do potrzebnych bibliotek. Był w stanie zbudować i wdrożyć w symulatorze i urządzeniu, ale nie archiwizować.

FranticRock
źródło
0

Aktualizacja: Xcode 9

Powyższe odpowiedzi nie działały dla mnie przy użyciu Xcode 9, ale ta odpowiedź działała idealnie dla mnie. Dodałem $(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/includedo moich „Ścieżek wyszukiwania nagłówków” i Xcode bez problemu połączył nagłówek mojej biblioteki statycznej.

Mohammed Abdullatif
źródło
-18

Oszczędź sobie kłopotów i zrób to = utwórz nowe konto użytkownika na swoim Macu - otwórz projekt na nowym koncie użytkownika - wszystkie problemy znikną. Oszczędzaj czas i zachowaj zdrowy rozsądek. wszystkie te nerdy odpowiedzi nie pomagają!

Powodzenia

Maks
źródło