Termasuk header non-modular di dalam modul framework

143

Saya menggunakan Xcode 6,

1) Pertama saya membuat perpustakaan dinamis (CoreLibrary). Perpustakaan ini berisi file RequestPoster.h.

2) Lalu saya membuat Kerangka Sentuhan Kakao dan menambahkan perpustakaan dinamis ini (CoreLibrary).

3) Kemudian kerangka kerja ini ditambahkan pada proyek saya dan memberikan kesalahan dalam file RequestPoster.h (CoreLibrary).

Kesalahan: Sertakan header non-modular di dalam kelas modul framework:

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

File-file ini tidak ditemukan dalam proyek.

Dev
sumber

Jawaban:

190

Coba buka Pengaturan Bangun di bawah "Target" dan atur "Izinkan Non-modular Termasuk dalam Modul Kerangka" menjadi YA.

Jawaban sebenarnya adalah bahwa lokasi impor perlu diubah oleh pemilik perpustakaan. File-file ifaddrs.h, arpa / inet.h, sys / types.h sedang diimpor dalam file .h dalam suatu kerangka kerja, yang Xcode tidak suka. Pengelola perpustakaan harus memindahkannya ke file .m. Lihat misalnya masalah ini di GitHub, di mana AFNetworking memperbaiki masalah yang sama: https://github.com/AFNetworking/AFNetworking/issues/2205

bcattle
sumber
2
Jika header dengan kesalahan menggunakan jenis dari header yang diimpor, apa yang disarankan? Untuk misalnya, jika header module.h dalam modul menyatakan suatu fungsi mengambil parameter tipe ifaddrs, mereka terikat untuk mengimpor ifaddrs.h.
Ayush Goel
Tapi bagaimana jika mereka termasuk sistem /usr/include/libproc.h?
Ben Leggiero
3
Bisakah Anda jelaskan apa dampak perubahan: Izinkan Non-modular Termasuk dalam Modul Kerangka
nr5
Saya pikir mungkin jawaban terbaik akan melibatkan membuatnya menjadi header modular, daripada pada dasarnya membungkam kesalahan ini. Saya dapat dengan mudah membayangkan Apple menghapus opsi untuk memungkinkan header non-modular dalam sebuah modul.
Ben Leggiero
170

Pastikan file header tersedia untuk umum sebagai bagian dari header publik framework.

Kerangka Kerja Goto -> Target -> Bangun Fase dan seret untuk memindahkan file header yang relevan dari Project ke Public. Semoga itu bisa membantu!

Tangkapan layar

Long Pham
sumber
3
Itu membantu saya untuk memasukkan kode Objective C ke dalam kerangka kerja Swift, terima kasih!
Vadim
1
Anda juga dapat membuat perubahan ini menjadi Keanggotaan Target dari Proyek ke Publik di file Anda dengan menggunakan jendela File Inspector di sebelah kanan layar utama XCode.
Pigpocket
Jika mengimpor pustaka ke dalam campuran swift / objc, perlu memastikan bahwa bridging header juga publik. Saya membuat kesalahan!
Nick H247
74

Anda dapat mengatur Izinkan Non-modular termasuk dalam Modul Kerangka dalam Pengaturan Bangun untuk target yang terpengaruh ke YA. Ini adalah pengaturan bangunan yang perlu Anda edit:

Bangun Pengaturan item yang perlu Anda edit

CATATAN : Anda harus menggunakan fitur ini untuk mengungkap kesalahan yang mendasarinya, yang saya temukan sering disebabkan oleh duplikasi kurung siku global yang disertakan dalam file dengan beberapa hubungan dependen, yaitu:

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

Jika pengaturan Izinkan Non-modular termasuk dalam Modul Bingkai untuk YA menghasilkan kesalahan "X adalah referensi yang ambigu" atau semacamnya, Anda harus dapat melacak duplikat yang menyinggung dan menghilangkannya. Setelah Anda membersihkan kode Anda, atur Izinkan Non-modular termasuk dalam Modul Bingkai kembali ke NO .

revprez
sumber
1
Ok, itu adalah kurung sudut yang menyebabkan masalah! Saya punya masalah dengan impor CocoaPods dan memperbaikinya dengan mengubah impor menggunakan tanda kutip bukan kurung sudut.
Michael Forrest
Ups, tidak. Menemukannya rusak setelah saya membersihkan proyek saya: - /
Michael Forrest
2
Saya tidak dapat menemukan peringatan 'rujukan ambigu' apa pun. Apa kelemahan dari membiarkannya diatur ke YA ?
Nicolas Miari
28

Saya memiliki masalah yang sama dan menyelesaikannya dengan hanya membuat file header publik. [masalah]

Jika Anda mengerjakan beberapa modul di proyek Anda. Maka file header Anda harus publik untuk digunakan di bagian lain dari proyek. Yang Anda butuhkan adalah memilih file header itu, dan dalam tampilan Utilities proyek. Ubah file dari Project / Private ke Public. Lihat gambar di bawah ini:

Mengubah ruang lingkup file header

Saad
sumber
Ini terjadi khususnya ketika Anda menduplikasi header publik yang ada, keanggotaan header yang digandakan diubah menjadi "project"
Jeremie
tidak itu tidak wajib untuk duplikasi. Ini dapat terjadi karena berbagai kasus misalnya jika Anda mengimpor beberapa proyek sebagai perpustakaan sepenuhnya di proyek Anda dan kemudian Anda mencoba untuk memodifikasi kelas privat. Anda tahu file header dan menulisnya tetapi aksesnya tidak umum untuk semua proyek.
Saad
23

"Termasuk header non-modular di dalam modul framework"

Ketika Anda mendapatkan kesalahan ini solusinya dalam beberapa keadaan bisa dengan hanya menandai file yang Anda coba impor sebagai "publik" di inspektur file "Target Membership". Standarnya adalah "Project", dan ketika diatur dengan cara ini dapat menyebabkan kesalahan ini. Itulah yang terjadi pada saya ketika mencoba mengimpor header Google Analytic ke dalam suatu kerangka kerja, misalnya.

John Bushnell
sumber
Jawaban ini banyak membantu saya dalam masalah yang sama. Saya tidak tahu kerangka file header dapat ditambahkan ke target. Dalam proyek aplikasi, header tidak pernah menjadi bagian dari target.
bio
20

Sebenarnya cara yang lebih mudah untuk memperbaikinya adalah dengan memindahkan #importpernyataan ke bagian atas .mfile sebagai gantinya (alih-alih memilikinya di .hfile header Anda ). Dengan cara ini tidak akan mengeluh bahwa itu termasuk file header non-modular. Aku punya masalah ini di mana Allow non-module includesdiatur untuk YESmelakukan TIDAK bekerja untuk saya, jadi dengan memindahkan ke file implementasi, berhenti mengeluh. Ini sebenarnya cara yang lebih disukai untuk mengimpor dan memasukkan file header. Setelah Anda melakukan ini, mengatur kembali ini NOharus berfungsi.

Idealnya kita harus berusaha dan bertujuan untuk Allow non-module includesmenetapkan NO. Menyetel ini YESdalam banyak kasus berarti Anda melakukan sesuatu yang salah. Pengaturan diterjemahkan menjadi "Izinkan mengimpor file header acak pada disk yang bukan bagian dari modul". Ini berlaku untuk kasus penggunaan yang sangat sedikit dalam praktek, dan pengaturan ini harus selalu NO(yaitu nilai default).

strangetimes
sumber
10

Jika Anda mengembangkan kerangka kerja Anda sendiri:

MENGAPA ini terjadi?

Jika ada file header publik yang Anda sebutkan di module.modulemap Anda memiliki pernyataan impor yang tidak disebutkan dalam modulemap, ini akan memberi Anda kesalahan. Karena mencoba mengimpor beberapa header yang tidak dideklarasikan sebagai modular (dalam module.modulemap), itu merusak modularitas kerangka kerja.

BAGAIMANA saya bisa memperbaikinya?

Cukup sertakan header yang memberikan kesalahan pada module.modulemap Anda dan buat lagi!

MENGAPA TIDAK hanya mengatur memungkinkan non-modular ke YA?

Karena ini bukan solusi di sini, dengan Anda memberi tahu proyek Anda "kerangka kerja ini seharusnya modular tetapi tidak. Gunakan entah bagaimana, saya tidak peduli." Ini tidak memperbaiki masalah modularitas perpustakaan Anda.

Untuk informasi lebih lanjut, periksa posting blog ini atau lihat dokumen dentang .

Mert Celik
sumber
bagaimana Anda mengaturnya module.modulemap dengan kerangka kerja proyek-proyek kakao, saya mencoba membiarkan perpustakaan saya dapat bekerja dengan proyek-proyek Swift saja, tetapi karena satu ketergantungan perpustakaan, module.modulemap tidak berfungsi, cocoapod adalah autogenerating modulemap, tetapi tampaknya tidak berfungsi, apakah Anda menghadapi sesuatu yang serupa?
Amadeu Cavalcante Filho
8

Jika Anda memerlukan ini untuk target CocoaPods tambahkan baris ini di 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
sumber
7

Allow Non-modular Includes in Framework Moduleshanya bekerja dalam kode objc. tidak bekerja dengan cepat.

Setelah periode penelitian, saya menemukan bahwa swift dapat mengirimkan parameter peringatan ke dentang, jadi setel OTHER_SWIFT_FLAGSke-Xcc -Wno-error=non-modular-include-in-framework-module mencegah kesalahan impor swift.

hanya untuk seseorang yang memiliki masalah yang sama

SolaWing
sumber
6

Saya memiliki masalah yang sama dan tidak ada yang membantu saya. Jadi saya berharap jawaban saya akan bermanfaat bagi seseorang. Dalam kasus saya masalahnya ada di pengaturan ALWAYS_SEARCH_USER_PATHS. Ketika diatur ke proyek TIDAK dibangun dan bekerja ok. Tetapi sejauh salah satu pod mengharuskannya disetel ke YA, saya menerima pesan kesalahan

Termasuk header non-modular di dalam modul framework

Setelah beberapa cangkir kopi dan meneliti sepanjang hari, saya menemukan bahwa menurut masalah yang diketahui dari catatan rilis Xcode 7.1 Beta 2 :

• Jika Anda mendapatkan kesalahan yang menyatakan "Sertakan tajuk non-modular di dalam modul kerangka kerja" untuk kerangka kerja yang dikompilasi sebelumnya, pastikan pengaturan bangunan "Selalu Cari Jalur Pengguna" disetel ke "Tidak". Standarnya adalah "Ya" hanya untuk alasan warisan. (22784786)

Saya menggunakan XCode 7.3, tetapi sepertinya bug ini belum diperbaiki.

iyuna
sumber
6

masalah yang sama membuat gila. akhirnya, saya menemukan meletakkan 'impor xxx.h' dalam implementasi, bukan antarmuka dapat memperbaiki masalah. Dan jika Anda menggunakan Cocoapods untuk mengelola proyek Anda. Anda dapat menambahkan

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

dalam file 'xxx.podspec' Anda.

贺彦文
sumber
6

Jika Anda melihat kesalahan ini di header payung ketika membangun kerangka kerja dinamis , pastikan Anda mengimpor file Anda sebagai:

#import "MyFile.h"

dan tidak seperti #import <MyFramework/MyFile.h>.

Misha Karpenko
sumber
2

Saya menemukan masalah ini juga dan awalnya mengira itu adalah masalah CocoaPods, tapi itu adalah masalah di pengaturan pembuatan aplikasi di mana seseorang (mungkin saya) telah menetapkan ${PODS_ROOT}di Header Search Paths dan mengaturnya untuk menjadi recursivepencarian. Ini memungkinkannya menemukan header yang tidak dimaksudkan untuk digunakan saat membangun aplikasi. Setelah saya atur ini untuk menggunakan non-recursivesemuanya baik-baik saja. menggunakan recursivepencarian adalah hack yang mengerikan untuk mencoba menemukan header yang tepat. Pelajaran yang dipetik.

ucangetit
sumber
Saya dapat mengkonfirmasi ini juga masalah saya.
Wilson Muñoz
Saya punya masalah dengan PersonalizedAdConsent dan ini memperbaikinya. Terima kasih!
Steven Elliott
1

Ini semacam masalah yang mengganggu bagi saya. Tampaknya tidak ada saran yang membantu kasus khusus saya, karena saya perlu menyertakan header "non-modular" dalam file header file individual saya. Pekerjaan di sekitar saya menggunakan menempel panggilan impor di file header awalan.

Greg
sumber
0

Saya akhirnya memindahkan Header Payung ke bawah daftar Header setelah memeriksa solusi di atas, dan yang bekerja di Xcode 9.3.

alfwatt
sumber
0

Saya menyelesaikannya dengan menghapus Modulesfolder dari framework.

  • Jelajahi lokasi kerangka kerja Anda yang ada di Proyek Aplikasi menggunakan finder

  • Masuk ke Test.frameworkfolder (Dalam kasus di atas akan CoreLibrary.framework) & Hapus Modulesfolder.

  • Bersihkan dan Bangun ulang aplikasi, itu akan menyelesaikan masalah.

Vittal Pai
sumber
0

Dalam kasus saya, saya lupa menambahkan file .h dan .m di bagian "s.source_files" file .podspecs.

setelah menambahkan ini di dalamnya berfungsi dengan baik.

masukkan deskripsi gambar di sini

Muhammad Ahmed Baig
sumber
0

coba @import FrameworkNamebukan#import "FrameworkName.h"

Ke Yang
sumber
-5

Saya bisa menghapus puluhan kesalahan ini dengan menggunakan Git clean. Inilah perintahnya: git clean -dffx && git reset --hard

Matt Bearson
sumber