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 directory
dodano 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ę doDerivedData
katalogu, aleheaders 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?
źródło
Odpowiedzi:
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
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.
źródło
$(TARGET_BUILD_DIR)
. Nawet podczas archiwizacji. ;)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
Ustawienia projektu biblioteki statycznej
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.
Ustawienia projektu korzystającego z biblioteki statycznej
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.
Zacznij korzystać z biblioteki
Teraz powinieneś być w stanie zaimportować swoją bibliotekę statyczną za pomocą
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:
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.
źródło
Projekt Xcode 4 nie może skompilować biblioteki statycznej
Błędy mogą obejmować; brakujące pliki nagłówkowe, „problem leksykalny lub preprocesor”
Rozwiązania:
źródło
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:
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.
źródło
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.
źródło
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/
źródło
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.
źródło
Ż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)
Zmień względną część adresu URL
usr/local/include
zgodnie z ustawieniem „Ścieżka do folderu publicznego nagłówka” biblioteki statycznejźródło
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
źródło
Dodaj następującą ścieżkę do ścieżek wyszukiwania nagłówków użytkownika :
To jest zweryfikowane!
źródło
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 ...
źródło
Ż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 :
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:
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.źródło
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.h
był zdecydowanie w miejscu niedostępnymsearch headers
nawet dodaje go doframework headers
ścieżki wyszukiwania,include
D.h
bezpośrednio i udał się do wszelkich starań, aby spróbować i dostaćDropboxSDK.h
znaleźć.Rozwiązanie
EXPLICITY przeciągnij
DropboxSDK.framework
plik do XcodeProject Navigation
i upewnij się, żeCopy Files if needed
jest zaznaczony. Upewnij się również, że cel jest zaznaczony w razie potrzeby.Ostrzeżenie
Ustawienie jawnej lokalizacji szkieletu w
build phases
nie 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
źródło
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.
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!
źródło
simply use frameworks - always -
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ć.
źródło
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)/include
do moich „Ścieżek wyszukiwania nagłówków” i Xcode bez problemu połączył nagłówek mojej biblioteki statycznej.źródło
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
źródło