Çerçeve modülünün içine modüler olmayan başlık dahil


143

Xcode 6 kullanıyorum,

1) Öncelikle dinamik bir kütüphane (CoreLibrary) oluşturuyorum. Bu kütüphane RequestPoster.h dosyasını içerir.

2) Sonra bir Cocoa Touch Framework oluşturdum ve bu dinamik kütüphaneyi (CoreLibrary) ekledim.

3) Sonra bu çerçeve projeme eklemek ve RequestPoster.h dosyasında (CoreLibrary) hata veriyor.

Hata: Çerçeve modülü sınıfının içine modüler olmayan başlık ekleyin:

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

Bu dosya projede bulunamadı.

Yanıtlar:


190

"Hedef" altında Oluşturma Ayarları'na gitmeyi deneyin ve "Çerçeve Modüllerinde Modüler Olmayan Eklemelere İzin Ver" seçeneğini EVET olarak ayarlayın.

Gerçek cevap, ithalatın yerinin kütüphane sahibi tarafından değiştirilmesi gerektiğidir. Bu dosyalar ifaddrs.h, arpa / inet.h, sys / types.h, Xcode'un beğenmediği bir çerçevede bir .h dosyasına içe aktarılıyor. Kütüphane yöneticisi bunları bir .m dosyasına taşımalıdır. Örneğin, AFNetworking'in aynı sorunu çözdüğü GitHub'daki bu konuya bakın: https://github.com/AFNetworking/AFNetworking/issues/2205


2
Hatalı üstbilginin içe aktarılan üstbilgilerden bir tür kullanması durumunda ne önerilir? Örneğin, modül içindeki header module.h, tür parametresini alan bir işlev bildirirse ifaddrs, ifaddrs.h dosyasını içe aktarmaya bağlanırlar.
Ayush Goel

Peki ya sistem içeriyorsa, ne gibi /usr/include/libproc.h?
Ben Leggiero


Belki de en iyi cevabın, temelde bu hatayı susturmak yerine modüler bir başlık yapmayı gerektireceğini düşünüyorum. Apple'ın bir modüldeki modüler olmayan başlıklara izin verme seçeneğini kaldırdığını kolayca hayal edebiliyorum.
Ben Leggiero

170

Başlık dosyalarının, çerçevenin genel başlıklarının bir parçası olarak herkese açık olduğundan emin olun.

Çerçeveye Git -> Hedef -> Aşama Oluştur ve ilgili başlık dosyalarını Proje'den Genel'e taşımak için sürükleyin. Umarım yardımcı olur!

Ekran görüntüsü


3
Bu, Objective C kodunu Swift çerçevesine dahil etmeme yardımcı oldu, teşekkürler!
Vadim

1
XCode'un ana ekranının sağındaki Dosya Denetçisi penceresini kullanarak da bu değişikliği, projenizden Proje'den Herkese Açık olarak yapabilirsiniz.
Pigpocket

Kütüphaneyi bir swift / objc karışımına içe aktarıyorsanız, köprüleme başlığının da halka açık olduğundan emin olmanız gerekir. Yaptığım hata!
Nick H247

74

Sen ayarlayabilirsiniz Olmayan modüler Çerçeve Modülleri içerir izin EVET etkilenen hedef için Yapı Ayarlarında. Bu, düzenlemeniz gereken yapı ayarıdır:

Düzenlemeniz gereken Yapı Ayarları öğesi

NOT : Bu özelliği, bazı bağımlı ilişkileri olan dosyalarda açılı ayraçlı genel içeriklerin çoğaltılmasından kaynaklandığımın altında yatan hatayı ortaya çıkarmak için kullanmalısınız:

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

Ayar Eğer Olmayan modüler Çerçeve Modülleri içerir İzin için EVET kümesindeki sonuçların hata veya tür bir şey "X belirsiz bir referanstır", sorunlu yinelenen (ler) izini ve bunları ortadan kaldırmak mümkün olmalıdır. Kodunuzu temizledikten sonra , Çerçeve Modüllerinde Modüler Olmayan eklemelere İzin Ver'i tekrar NO olarak ayarlayın .


1
Tamam, soruna neden olan köşeli parantezlerdi! Bir CocoaPods içe aktarma ile bu sorunu vardı ve köşeli ayraç yerine tırnak kullanmak için ithalat değiştirerek düzeltildi.
Michael Forrest

Hata! Hayır. Projemi temizledikten sonra bozulduğunu
Michael Forrest

2
Herhangi bir 'belirsiz referans' uyarısı bulamıyorum. EVET olarak ayarlı bırakmanın sakıncaları nelerdir ?
Nicolas Miari

29

Aynı sorunu yaşadım ve sadece başlık dosyasını herkese açık hale getirerek çözdüm. [sorun]

Projenizde birden fazla modül üzerinde çalışıyorsanız. Daha sonra, başlık dosyanızın projelerin diğer bölümlerinde kullanılabilmesi için herkese açık olması gerekir. İhtiyacınız olan şey, bu başlık dosyasını ve proje Yardımcı Programları görünümünü seçmek. Dosyayı Project / Private yerine Public olarak değiştirin. Aşağıdaki resme bakın:

Başlık dosyası kapsamını değiştirme


Bu, özellikle mevcut bir genel üstbilgiyi kopyaladığınızda, yinelenen üstbilgi üyeliği "proje" olarak değiştirilir
Jeremie

hayır çoğaltma işlemi için zorunlu değildir. Örneğin, bazı projeleri projenizde tamamen kütüphane olarak içe aktarırsanız ve sonra özel sınıfları değiştirmeye çalışırsanız, farklı durumlar nedeniyle oluşabilir. Başlık dosyasını biliyor ve yazıyorsunuz ancak erişim tüm projelerde herkese açık değil.
Saad

23

"Modüler olmayan üstbilgiyi çerçeve modülünün içine dahil et"

Bu hatayı aldığınızda, bazı durumlarda çözüm, içe aktarmaya çalıştığınız dosyayı "Hedef Üyelik" dosya denetçisinde "genel" olarak işaretlemek olabilir. Varsayılan "Proje" dir ve bu şekilde ayarlandığında bu hataya neden olabilir. Örneğin, Google Analytic'in başlıklarını bir çerçeveye aktarmaya çalışırken böyleydim.


Bu cevap benzer sorunumda bana çok yardımcı oldu. Çerçeve başlık dosyalarının hedefe eklenebileceğini bilmiyordum. Uygulama projelerinde, başlıklar hiçbir zaman hedefin bir parçası değildir.
bio

20

Aslında bunu düzeltmenin daha kolay bir yolu, #importifadeyi .mbunun yerine dosyanın üst kısmına taşımaktır ( .hbaşlık dosyanızda bulunmak yerine). Bu şekilde, modüler olmayan bir başlık dosyası içerdiğinden şikayet etmez. Ben bu sorunu vardı Allow non-module includesayarlı YESyaptılar DEĞİL böylece uygulama dosyasına taşıyarak, iş için beni, bu şikayet durdu. Aslında bu, başlık dosyalarını içe aktarmanın ve yine de dahil etmenin tercih edilen yoludur. Bunu yaptıktan sonra, bunu geri ayarlamak NOişe yarayacaktır.

İdeal olarak, Allow non-module includesayarlamayı hedeflemeliyiz NO. Bunu YESçoğu durumda ayarlamak yanlış bir şey yaptığınız anlamına gelir. Bu ayar, "Modülün başka bir parçası olmayan diskte rasgele başlık dosyalarının alınmasına izin ver" anlamına gelir. Bu, pratikte çok az kullanım durumu için geçerlidir ve bu nedenle bu ayar her zaman NO(yani varsayılan değer) olmalıdır.


10

Kendi çerçevenizi geliştiriyorsanız:

Bu neden oluyor?

Eğer bahsettiğimiz kamu başlık dosyaları Varsa module.modulemap olan ithalat ifadeleri var olmayan modulemap belirtilen bu size hatayı verecektir. Modüler olarak bildirilmeyen bir üstbilgiyi (module.modulemap'ta) içe aktarmaya çalıştığından, çerçevenin modülerliğini bozar.

NASIL düzeltebilirim?

Sadece modülünüze hata veren başlığı ekleyin. Modulemap ve tekrar derleyin!

NEDEN sadece modüler olmayan izinleri EVET olarak ayarlamıyor?

Çünkü bu gerçekten bir çözüm değil, projenize "bu çerçevenin modüler olması gerekiyordu, ama değil. Bir şekilde kullanın, umrumda değil." Bu, kitaplığınızın modülerlik sorununu çözmez.

Daha fazla bilgi için bu blog gönderisine bakın veya clang belgelerine bakın .


modülü nasıl ayarladınız.modulemap kakao projeleri çerçevesiyle, kütüphanemin sadece Swift projeleriyle çalışmasına izin vermeye çalıştım, ancak kütüphanenin bir bağımlılığı olan module.modulemap çalışmıyor, cocoapod modül haritasını otomatik olarak oluşturuyor, ancak işe yaramıyor gibi görünüyor, benzer bir şeyle karşılaştınız mı?
Amadeu Cavalcante Filho

8

CocoaPods hedefleri için buna ihtiyacınız varsa, şu satırları ekleyin 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

7

Allow Non-modular Includes in Framework Modulessadece objc kodunda çalışır. hızlı çalışmıyor.

Araştırmanın bir süre sonra, o konuda hızlı şekilde ayarlayın clang uyarı parametresi iletebilirsiniz bulundu OTHER_SWIFT_FLAGSetmek -Xcc -Wno-error=non-modular-include-in-framework-moduleengelleme hızlı ithalat hatası.

sadece aynı sorunu olan biri için


6

Aynı sorunu yaşadım ve yukarıdan hiçbir şey bana yardımcı olmadı. Umarım cevabım birisi için faydalı olur. Benim durumumda sorun ALWAYS_SEARCH_USER_PATHS ayarındaydı. Hayır proje olarak ayarlandığında ve inşa tamam ok. Ancak kapsülden birinin EVET olarak ayarlanmasını gerektirdiği sürece bir hata alıyordum

Çerçeve modülünün içine modüler olmayan başlık dahil

Birkaç fincan kahve ve tüm gün araştırdıktan sonra, Xcode 7.1 Beta 2 sürüm notlarının bilinen sorunlarına göre şunu öğrendim :

• Daha önce derlenen bir çerçeve için "Çerçeve modülünün içine modüler olmayan üstbilgiyi dahil et" ifadesini alırsanız, "Her zaman Kullanıcı Yollarını Ara" oluşturma ayarının "Hayır" olarak ayarlandığından emin olun. Yalnızca eski nedenlerle varsayılan "Evet" tir. (22784786)

XCode 7.3 kullanıyordum, ancak bu hata henüz düzeltilmemiş gibi görünüyor.


6

aynı sorun çılgın olun. son olarak, ben yerine 'ithalat xxx.h' koymak bulmak yerine arayüzü sorunu çözebilir.Ve projeyi yönetmek için Cocoapods kullanırsanız. ekleyebilirsiniz

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

'xxx.podspec' dosyanızda.


6

İster şirket bu hatayı görürseniz şemsiye başlığındaki bir oluştururken dinamik bir çerçeve , emin olarak dosyanızı içe olun:

#import "MyFile.h"

ve değil olarak #import <MyFramework/MyFile.h>.


2

Bu sorunla da karşılaştım ve başlangıçta bunun bir CocoaPods sorunu olduğunu düşündüm, ancak birisinin (muhtemelen ben) ${PODS_ROOT}Başlık Arama Yollarında ayarladığı ve bir recursivearama olarak ayarladığı uygulama oluşturma ayarlarında bir sorun vardı . Bu, uygulamayı oluştururken kullanılması amaçlanmamış başlıkları bulmasına izin veriyordu. Bunu kullanmak için bir kez ayarladım non-recursiveher şey iyiydi. recursivearama kullanmak uygun başlıkları bulmak için korkunç bir kesmek. Ders öğrenildi.


Bunun da benim sorunum olduğunu onaylayabilirim.
Wilson Muñoz

PersonalizedAdConsent ile bu sorunu yaşadım ve bu düzeltti. Teşekkürler!
Steven Elliott

1

Bu benim için biraz can sıkıcı bir konuydu. Bireysel dosya başlığı dosyama "modüler olmayan" başlıkları eklemem gerektiğinden, özel durumuma yardımcı olacak hiçbir öneri görünmüyordu. Kullandığım iş, içe aktarma çağrısını önek başlık dosyasına yapıştırmaktı.


0

Yukarıdaki çözümleri kontrol ettikten sonra Umbrella Header'ı Headers listesinin altına taşıdım ve bu Xcode 9.3'te çalıştı.


0

ModulesKlasörü çerçeveden kaldırarak çözdüm.

  • Bulucu kullanarak Uygulama Projesi'nde bulunan çerçeve konumunuza göz atın

  • Test.frameworkKlasörün içine gidin (Yukarıdaki durumda olacaktır CoreLibrary.framework) & ModulesKlasörü sil .

  • Temiz ve Yeniden Uygulamayı oluşturun, sorunu çözecektir.


0

Benim durumumda .h ve .m dosyasını .podspecs dosyasının "s.source_files" bölümüne eklemeyi unuttum.

bunu ekledikten sonra iyi çalışıyor.

resim açıklamasını buraya girin


0

@import FrameworkNameyerine dene#import "FrameworkName.h"


-5

Git clean kullanarak düzinelerce bu hatayı temizledim. İşte komut: git clean -dffx && git reset --hard

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.