Dołącz niemodułowy nagłówek do modułu frameworka

143

Używam Xcode 6,

1) Najpierw tworzę bibliotekę dynamiczną (CoreLibrary). Ta biblioteka zawiera plik RequestPoster.h.

2) Następnie tworzę Cocoa Touch Framework i dodałem tę bibliotekę dynamiczną (CoreLibrary).

3) Następnie ta struktura jest dodawana do mojego projektu i powoduje błąd w pliku RequestPoster.h (CoreLibrary).

Błąd: uwzględnij niemodułowy nagłówek w klasie modułu platformy:

ifaddrs.h, arpa / inet.h, sys / types.h>

Nie znaleziono tych plików w projekcie.

Dev
źródło

Odpowiedzi:

190

Spróbuj przejść do Ustawień kompilacji w sekcji „Cel” i ustaw „Zezwalaj na niemodularne dołączenia w modułach struktury” na TAK.

Prawdziwa odpowiedź jest taka, że ​​lokalizacja importu musi zostać zmieniona przez właściciela biblioteki. Te pliki ifaddrs.h, arpa / inet.h, sys / types.h są importowane w pliku .h we frameworku, czego Xcode nie lubi. Opiekun biblioteki powinien przenieść je do pliku .m. Zobacz na przykład ten problem na GitHub, gdzie AFNetworking naprawił ten sam problem: https://github.com/AFNetworking/AFNetworking/issues/2205

bydło
źródło
2
Jeśli nagłówek z błędem używa typu z zaimportowanych nagłówków, co jest zalecane? Na przykład, jeśli nagłówek module.h w module deklaruje funkcję przyjmującą parametr typu ifaddrs, są one zobowiązane do zaimportowania ifaddrs.h.
Ayush Goel
Ale co, jeśli zawierają system, na przykład /usr/include/libproc.h?
Ben Leggiero
3
Czy mógłbyś wyjaśnić, jaki wpływ ma zmiana: Zezwól na
niemodułowe dołączenia do
Myślę, że być może najlepszą odpowiedzią byłoby uczynienie go modułowym nagłówkiem, zamiast w zasadzie wyciszać ten błąd. Mogę sobie łatwo wyobrazić Apple usuwającego opcję zezwalającą na niemodularne nagłówki w module.
Ben Leggiero
170

Upewnij się, że pliki nagłówkowe są publicznie dostępne jako część publicznych nagłówków struktury.

Idź do Framework -> Target -> Build Phases i przeciągnij, aby przenieść odpowiednie pliki nagłówkowe z Project do Public. Mam nadzieję, że to pomoże!

Zrzut ekranu

Long Pham
źródło
3
To pomogło mi dołączyć kod Objective C do frameworka Swift, dzięki!
Vadim
1
Możesz również wprowadzić tę zmianę w docelowym członkostwie z projektu na publiczny w swoim pliku, używając okna File Inspector po prawej stronie głównego ekranu XCode.
Pigpocket,
Jeśli importujesz bibliotekę do mieszanki swift / objc, musisz upewnić się, że nagłówek mostkowania jest również publiczny. Popełniłem błąd!
Nick H247
74

Możesz ustawić opcję Zezwalaj na niemodularne dołączanie w modułach struktury w ustawieniach kompilacji dla celu, na który ma to wpływ, na TAK. Oto ustawienie kompilacji, które musisz edytować:

Element ustawień budowania, który musisz edytować

UWAGA : Należy użyć tej funkcji, aby odkryć podstawowy błąd, który, jak stwierdziłem, jest często powodowany przez powielanie globalnych dołączeń w nawiasach kątowych w plikach z pewną zależnością, tj .:

#import <Foo/Bar.h> // referred to in two or more dependent files

Jeśli ustawienie Zezwalaj na niemodularne dołączanie w modułach ramek na TAK powoduje zestaw błędów „X jest niejednoznacznym odniesieniem” lub coś w tym rodzaju, powinieneś być w stanie wyśledzić szkodliwe duplikaty i je wyeliminować. Po wyczyszczeniu kodu ustaw opcję Zezwalaj na niemodularne dołączenia w modułach ramek z powrotem na NIE .

revprez
źródło
1
Ok, problem był spowodowany przez nawiasy kątowe! Miałem ten problem z importem CocoaPods i naprawiłem go, zmieniając import, aby używał cudzysłowów zamiast nawiasów kątowych.
Michael Forrest
Ups, nie, nie udało się. Odkryłem, że został uszkodzony po wyczyszczeniu mojego projektu: - /
Michael Forrest
2
Nie mogę znaleźć żadnych ostrzeżeń o „niejednoznacznym odwołaniu”. Jakie są wady pozostawienia ustawienia na TAK ?
Nicolas Miari
28

Miałem ten sam problem i rozwiązałem go, po prostu upubliczniając plik nagłówkowy. [problem]

Jeśli pracujesz nad wieloma modułami w swoim projekcie. Następnie plik nagłówkowy musi być publiczny, aby mógł być używany w innych częściach projektów. To, czego potrzebujesz, to wybrać ten plik nagłówkowy i w widoku Narzędzia projektu. Zmień plik z projektu / prywatnego na publiczny. Zobacz zdjęcie poniżej:

Zmiana zakresu pliku nagłówkowego

Saad
źródło
Dzieje się tak w szczególności, gdy zduplikujesz istniejący publiczny nagłówek, zduplikowane członkostwo w nagłówku zostanie zmienione na „projekt”
Jeremie
nie, nie jest to obowiązkowe w przypadku powielania. Może się to zdarzyć z różnych powodów, na przykład jeśli importujesz jakiś projekt jako bibliotekę w całości do swojego projektu, a następnie próbujesz zmodyfikować klasy prywatne. Znasz plik nagłówkowy i zapisujesz go, ale dostęp nie jest publiczny dla wszystkich projektów.
Saad
22

„Uwzględnij niemodułowy nagłówek wewnątrz modułu struktury”

Gdy pojawi się ten błąd, w niektórych przypadkach rozwiązaniem może być po prostu oznaczenie pliku, który próbujesz zaimportować, jako „publiczny” w inspektorze plików „Członkostwo docelowe”. Wartość domyślna to „Projekt” i ustawienie w ten sposób może spowodować ten błąd. Tak było na przykład podczas próby zaimportowania nagłówków Google Analytic do frameworka.

John Bushnell
źródło
Ta odpowiedź bardzo mi pomogła w moim podobnym problemie. Nie wiedziałem, że pliki nagłówkowe frameworka można dodać do celu. W projektach aplikacji nagłówki nigdy nie są częścią celu.
biografia
20

W rzeczywistości łatwiejszym sposobem naprawienia tego jest przeniesienie #importinstrukcji na początek .mpliku (zamiast umieszczania jej w .hpliku nagłówkowym). W ten sposób nie będzie narzekać, że zawiera niemodułowy plik nagłówkowy. Miałem ten problem gdzie Allow non-module includesustawiony YEStak nie działa na mnie, więc przesuwając go do pliku wdrażania, zatrzymał sędzią. W rzeczywistości jest to preferowany sposób importowania i włączania plików nagłówkowych. Gdy to zrobisz, ustawienie z powrotem na NOpowinno działać.

Idealnie powinniśmy starać i dążyć do posiadania Allow non-module includesustawiony NO. Ustawienie tego YESw większości przypadków oznacza, że ​​robisz coś źle. To ustawienie oznacza „Zezwalaj na importowanie losowych plików nagłówkowych na dysku, które w innym przypadku nie są częścią modułu”. Odnosi się to do bardzo niewielu przypadków użycia w praktyce, więc to ustawienie powinno zawsze być NO(tj. Wartość domyślna).

strangetimes
źródło
10

W przypadku, gdy tworzysz własny framework:

Dlaczego to się dzieje?

Jeśli którykolwiek z publicznych plików nagłówkowych, o których wspominałeś w module.modulemap, zawiera instrukcje importu, które nie są wymienione w modulemap, spowoduje to błąd. Ponieważ próbuje zaimportować nagłówek, który nie jest zadeklarowany jako modułowy (w module.modulemap), łamie modułowość frameworka.

JAK to naprawić?

Po prostu dołącz nagłówek, który spowodował błąd w module.modulemap i zbuduj ponownie!

DLACZEGO NIE po prostu ustawić zezwolenie niemodułowe na TAK?

Ponieważ nie jest to tak naprawdę rozwiązanie, mówisz swojemu projektowi „ten framework miał być modułowy, ale tak nie jest. Użyj go jakoś, nie obchodzi mnie to”. Nie rozwiązuje to problemu modułowości biblioteki.

Więcej informacji można znaleźć w tym poście na blogu lub w dokumentacji clang .

Mert Celik
źródło
jak to skonfigurowałeś module.modulemap z frameworkiem projektów cocoa, próbowałem pozwolić mojej bibliotece na pracę z projektami tylko w Swift, ale ponieważ jedna zależność biblioteki, module.modulemap nie działa, cocoapod jest autogenerowanie mapy modulemap, ale wydaje się nie działać, czy spotkałeś się z czymś podobnym?
Amadeu Cavalcante Filho
8

Jeśli potrzebujesz tego dla celów CocoaPods, dodaj te wiersze w Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end
k06a
źródło
7

Allow Non-modular Includes in Framework Modulesdziała tylko w kodzie objc. nie działa szybko.

Po okresie badań odkryłem, że swift może przekazać parametr ostrzeżenia do clang, więc ustawiono, OTHER_SWIFT_FLAGSaby -Xcc -Wno-error=non-modular-include-in-framework-modulepowstrzymać błąd szybkiego importu.

tylko dla kogoś, kto ma ten sam problem

SolaWing
źródło
6

Miałem ten sam problem i nic z góry mi nie pomogło. Mam więc nadzieję, że moja odpowiedź będzie dla kogoś pomocna. W moim przypadku problem był w ustawieniu ALWAYS_SEARCH_USER_PATHS. Kiedy był ustawiony na ŻADNY projekt został zbudowany i działał dobrze. Ale o ile jeden z podów wymagał ustawienia na TAK, otrzymałem błąd

Dołącz niemodułowy nagłówek do modułu frameworka

Po kilku filiżankach kawy i całodziennych poszukiwaniach dowiedziałem się, że zgodnie ze znanymi wydaniami Xcode 7.1 Beta 2 :

• Jeśli pojawi się błąd z informacją „Uwzględnij niemodułowy nagłówek w module platformy” dla platformy, która została wcześniej skompilowana, upewnij się, że ustawienie kompilacji „Zawsze szukaj ścieżek użytkownika” jest ustawione na „Nie”. Wartość domyślna to „Tak” tylko ze starszych powodów. (22784786)

Używałem jednak XCode 7.3, ale wygląda na to, że ten błąd nie został jeszcze naprawiony.

iyuna
źródło
6

ten sam problem sprawia, że ​​crazy. w końcu umieszczam 'import xxx.h' w implementacji zamiast interfejsu, może rozwiązać problem.A jeśli używasz Cocoapods do zarządzania swoim projektem. możesz dodać

s.user_target_xcconfig = {'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'TAK'}

w pliku „xxx.podspec”.

贺彦文
źródło
6

Jeśli widzisz ten błąd w nagłówku parasolowym podczas tworzenia struktury dynamicznej , pamiętaj, aby zaimportować plik jako:

#import "MyFile.h"

a nie jako #import <MyFramework/MyFile.h>.

Misha Karpenko
źródło
2

Natknąłem się również na ten problem i początkowo myślałem, że jest to problem z CocoaPods, ale był to problem w ustawieniach kompilacji aplikacji, w których ktoś (prawdopodobnie ja) ustawił ${PODS_ROOT}ścieżki wyszukiwania nagłówków i ustawił to jako recursivewyszukiwanie. Umożliwiło to znalezienie nagłówków, które nie były przeznaczone do użycia podczas tworzenia aplikacji. Kiedy ustawiłem to na użycie, non-recursivewszystko było w porządku. używanie recursivewyszukiwania to okropny sposób na znalezienie odpowiednich nagłówków. Wyciągnięta lekcja.

ucangetit
źródło
Mogę potwierdzić, że to też był mój problem.
Wilson Muñoz
Miałem ten problem z PersonalizedAdConsent i to go naprawiło. Dzięki!
Steven Elliott
1

To był dla mnie trochę irytujący problem. Żadne sugestie nie wydawały się pomocne w moim konkretnym przypadku, ponieważ musiałem uwzględnić „niemodularne” nagłówki w moim indywidualnym pliku nagłówkowym. Obejście, którego użyłem, polegało na umieszczeniu wywołania importu w pliku nagłówka prefiksu.

Greg
źródło
0

Skończyło się na przeniesieniu Umbrella Header na dół listy Headers po sprawdzeniu powyższych rozwiązań i to zadziałało w Xcode 9.3.

alfwatt
źródło
0

Rozwiązałem to usuwając Modulesfolder z frameworka.

  • Przejdź do lokalizacji struktury, która jest obecna w projekcie aplikacji, używając wyszukiwarki

  • Wejdź do Test.frameworkfolderu (w powyższym przypadku będzie CoreLibrary.framework) i Usuń Modulesfolder.

  • Wyczyść i ponownie skompiluj aplikację, rozwiąże to problem.

Vittal Pai
źródło
0

W moim przypadku zapomniałem dodać plik .h i .m w sekcji "s.source_files" pliku .podspecs.

po dodaniu tego działa dobrze.

wprowadź opis obrazu tutaj

Muhammad Ahmed Baig
źródło
0

spróbuj @import FrameworkNamezamiast#import "FrameworkName.h"

Ke Yang
źródło
-5

Udało mi się usunąć dziesiątki tych błędów za pomocą narzędzia Git clean. Oto polecenie: git clean -dffx && git reset --hard

Matt Bearson
źródło