Sekarang saya ingin memigrasi kerangka kerja ObjC saya ke Swift dan saya mendapat kesalahan berikut:
include of non-modular header inside framework module 'SOGraphDB'
Referensi adalah file header yang hanya mendefinisikan protokol dan saya menggunakan file header ini di beberapa kelas untuk menggunakan protokol ini.
Tampaknya terkait dengan fitur modul tetapi saat ini tidak cukup jelas bagaimana cara memperbaikinya, apakah Anda tahu solusinya?
MEMPERBARUI:
Ini adalah kesalahan kompilasi Swift.
PEMBARUAN 2:
Perbaikan cepat (tetapi tidak menyelesaikan akar permasalahan) adalah untuk menetapkan pengaturan berikut ke yes: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YA
objective-c
frameworks
swift
Stephan
sumber
sumber
Jawaban:
Apakah tajuk Anda publik?
Pilih file header di penjelajah proyek. Kemudian pada bagian di sebelah kanan dalam xcode, Anda akan melihat ada dropdown di sebelah target. Ubah itu dari "proyek" menjadi "publik". Ini berhasil untuk saya.
sumber
Ini adalah perilaku kompiler yang diharapkan dan untuk alasan yang sangat bagus.
Saya pikir sebagian besar orang mengalami masalah ini disebabkan setelah mereka beralih dari
Application Target
keFramework Target
dan mulai menambahkan header C dan Objective C ke header payung kerangka kerja yang mengharapkannya memiliki perilaku yang sama dengan Bridging Header aplikasi , yang berperilaku berbeda. Header payung sebenarnya dirancang untuk kerangka kerja Swift, obj-c campuran dan tujuannya adalah mengekspos API ke dunia luar yang memiliki kerangka kerja Anda dalam tujuan-c atau c. Itu artinya tajuk yang kami taruh di sana harus ada dalam ruang publik.Seharusnya tidak digunakan sebagai tempat yang mengekspos header Objective-C / C yang bukan bagian dari kerangka kerja Anda ke kode cepat kerangka kerja Anda. Karena dalam hal ini tajuk ini juga akan diekspos sebagai bagian dari modul kerangka kerja kami ke dunia luar, yang sering kali bukan yang ingin kita lakukan karena merusak modularitas. (Dan itulah mengapa Memungkinkan Non-modular Termasuk dalam Kerangka Modul default untuk TIDAK )
Untuk mengekspos pustaka Objective-C / C ke kode kerangka kerja Anda, kita harus mendefinisikan modul swift terpisah untuk pustaka tersebut. Maka cepat standar
import YourLegacyLibrary
dapat digunakan.Biarkan saya menunjukkan ini pada beberapa skenario umum: menanamkan
libxml2
ke dalam kerangka kerja kami.1. Pertama-tama Anda perlu membuat
module.modulemap
file yang akan terlihat seperti ini:Untuk kerangka OSX:
Untuk kerangka kerja iOS:
Yang perlu dilakukan adalah membungkus header dan header lain yang dirujuk di dalam modul swift, sehingga swift kemudian dapat menghasilkan binding cepat untuk antarmuka C ini.
2. Kemudian di direktori proyek xcode Anda, buat folder
SwiftLibXML2
dan letakkan module.modulemap di sana3. Dalam Pengaturan Bangun , tambahkan
$(SDKROOT)/usr/include/libxml2
ke Jalur Pencarian Header4. Di Bangun Pengaturan , tambahkan
$(SRCROOT)/SwiftLibXML2
ke Impor Jalur5. Di bawah tab General Project , tambahkan
libxml2.tbd
ke Linked Frameworks and Libraries .Sekarang Anda mengimpor modul ini jika diperlukan dengan:
(Jika Anda ingin melihat contoh module.map yang lebih lengkap, saya sarankan merujuk modul Darwin.modulemap di
/usr/include/module.modulemap
, Anda perlu menginstal alat baris perintah Xcode untuk pergi ke sana, referensi Hilang / usr / termasuk dalam OS X El Capitan )sumber
module.map
sudah tidak digunakan lagi, harus diubah namanyamodule.modulemap
clang.llvm.org/docs/Modules.html#attributesimport SwiftLibXML2
di Objective-C? Terima kasih!Berikut cara menerapkan perbaikan cepat secara otomatis sehingga Anda tidak perlu mengubah
Pods.xcodeproj
secara manual setelah masing-masingpod install
.Tambahkan potongan ini ke akhir Podfile Anda:
sumber
Solusi bagi saya adalah untuk pergi pada target-> membangun pengaturan-> Izinkan non-modular termasuk dalam Modul Kerangka beralih ke YA!
sumber
Saya pikir saya bisa mengatasi ini. Saya punya beberapa kode model yang menggunakan sqlite3 dalam suatu framework. Dalam kasus saya, pelakunya adalah <sqlite3.h>.
Masalahnya adalah bahwa di header Module / Module.h saya, saya mengimpor header publik yang mengimpor <sqlite3.h>. Solusinya adalah menyembunyikan semua tipe sqlite3_xxx dan memastikannya tidak terlihat di publik .h. Semua referensi langsung ke sqlite3 dibuat visibilitas pribadi atau proyek. Sebagai contoh, saya memiliki singleton publik yang memiliki beberapa pointer sqlite3_stmt menggantungnya. Saya memindahkan mereka ke kelas terpisah yang sekarang hanya deklarasi maju di header publik itu. Sekarang saya bisa membangun.
Secara kebetulan, pengaturan CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES tidak berfungsi. Saya mencoba mengaturnya baik dalam kerangka kerja dan proyek dependen. Solusi ini diperlukan, meskipun saya tidak yakin mengapa.
sumber
Dalam Swift :
1. Ubah proyek Xcode Anda dan Pengaturan Bangun target seperti yang disebutkan di bawah ini:
Izinkan Non-modular Termasuk Dalam Modul Kerangka: Tidak
Aktifkan Bitcode: Ya
2. Gunakan versi terbaru saat ini yang tersedia untuk GoogleMaps iOS SDK (gunakan CocoaPods untuk mendapatkannya):
GoogleMaps (1.10.4)
3. Komentari impor yang bermasalah:
4. Buat atau modifikasi file header bridging Anda, tambahkan impor yang bermasalah:
[Nama Proyek Xcode Anda] -Bridging-Header.h
5. Bersihkan dan bangun kembali proyek Xcode Anda.
sumber
Jawaban ini kedaluwarsa.
Saat mengimpor kerangka kerja, Anda harus mengimpor semua file header yang berbagi dependensi dengan header root. Cara termudah untuk memastikan ini selalu berhasil adalah dengan mengimpor semua header di folder "Header" kerangka kerja ke jalur header publik Anda.
Kompiler Swift menggunakan informasi ini untuk menghasilkan peta simbol yang tidak cacat bersama dengan informasi jenis yang terkait.
sumber
Jangan
Melakukan
sumber
File header dialokasikan ke target tetapi hanya ditandai sebagai proyek yang terlihat, hanya perubahan untuk mengarahkan publik ke resolusi kesalahan ini.
sumber
Saya tahu bahwa ini adalah pertanyaan lama, tetapi 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
Setelah beberapa cangkir kopi dan meneliti sepanjang hari, saya menemukan bahwa menurut masalah yang diketahui dari catatan rilis Xcode 7.1 Beta 2 :
Saya menggunakan XCode 7.3, tetapi sepertinya bug ini belum diperbaiki.
sumber
Beralih pengaturan Build> Izinkan non-modular termasuk dalam Modul Kerangka ke YA! memecahkan masalah yang sama untuk saya.
sumber
Saya ingin menambahkan pengalaman saya dengan masalah ini juga.
Hanya untuk meringkas:
Inilah 2 tambahan saya untuk jawaban di atas:
<framework/headerName.h>
, tetapi hanya seperti ini"headerName.h"
, masalahnya hilang.Saya mencoba yang terakhir ini, dan sejauh ini saya tidak mengalami masalah ini lagi, namun saya menduga bahwa solusi ini hanya valid jika Anda telah menerapkan beberapa jawaban teratas (perhatikan: mereka tidak semua kompatibel satu sama lain, misalnya , pendekatan modul dan pemberian header non-modular mencakup).
sumber
Saya memiliki masalah ini ketika memasukkan kerangka kerja saya sendiri dalam sebuah proyek. Memperbaikinya dengan meletakkan semua impor sqlite3.h ke file .m, bukan yang publik .h. Saya berasumsi bahwa perpustakaan lain mungkin menandai masalah serupa dengan Xcode.
sumber
Saya punya masalah khusus dengan Facebook 4.02 SDK dan FBSDKCoreKit.
Saya melakukan semua langkah tetapi masih kesalahan tentang header non modular. saya seret dan jatuhkan hanya header spesifik dari kerangka kerja untuk membangun bagian header fase->.
Kemudian secara otomatis membuat salinan tajuk pada navigator proyek di bagian atas.
Saya menghapusnya dari fase build -> header dan menghapus file baru dan bekerja dengan baik.
Suka itu ulang atau sesuatu.
sumber
Dalam kasus saya (Xcode 9 beta 6 - Swift 4 - menggunakan Cocoapods) ini diselesaikan ketika saya menghapus Podfile.lock dan direktori Pods dan berlari
pod install
lagisumber
Saya mendapat masalah ini setelah memperbarui proyek dari swift2 ke swift3. Saya menggunakan XCode 8.3.2 untuk memperbarui kode dan tidak bisa menghilangkan kesalahan "header non-modular di dalam modul kerangka kerja". Ketika saya membuka proyek yang sama di versi lain XCode (versi 9.0.1) kesalahan tidak muncul.
sumber
Paling umum kesalahan ini disebabkan oleh jawaban yang dipilih, namun saya memiliki kesalahan ini muncul sekali secara tidak sengaja ketika menyeret file kerangka kerja ke folder proyek baru saya. Saya mengklik untuk menghapus kerangka kerja tetapi secara tidak sengaja menekan hanya 'Hapus Referensi' ke kerangka kerja daripada benar-benar menghapus file sepenuhnya. Pada titik ini jika saya membuka folder proyek saya di Finder saya melihat file seperti 'CoreLocation' dan 'AudioToolbox' di sana. Menghapus file-file ini dari folder proyek dan membersihkan proyek memperbaiki masalah.
sumber
Setelah mengizinkan untuk mengimpor termasuk non modular, Anda dapat mencoba untuk mengimpor modul itu menggunakan header Objective-C Bridging:
sumber
Saya menyelesaikannya dengan menghapus
Modules
folder dari framework.Jelajahi lokasi kerangka kerja Anda yang ada di Proyek Aplikasi menggunakan finder
Masuk ke
Test.framework
folder (Dalam kasus di atas akanSOGraphDB.framework
) & HapusModules
folder.Bersihkan dan Bangun ulang aplikasi, itu akan menyelesaikan masalah.
sumber
Saya mengalami masalah ini mengimpor kerangka Parse. Satu-satunya cara saya bisa memperbaikinya adalah membuang semua perubahan saya sejak komit terakhir saya (hanya menghapus kerangka kerja dan membersihkan proyek tidak berfungsi) dan menambahkan Parse lagi (setelah unduhan baru SDK) dengan kerangka kerja lain yang diperlukan.
sumber