Judul alternatif untuk membantu pencarian
- Xcode tidak dapat menemukan header
- Hilang .h di Xcode
- File Xcode .h tidak ditemukan
- File masalah leksikal atau preprocessor tidak ditemukan
Saya sedang mengerjakan proyek aplikasi iOS yang berasal dari Xcode 3. Sekarang saya telah pindah ke Xcode 4. Proyek saya membangun sejumlah perpustakaan statis.
Library statis tersebut juga mendeklarasikan header publik dan header tersebut digunakan oleh kode aplikasi. Di Xcode 3.x header disalin (sebagai fase build) ke public headers directory
, lalu dalam proyek aplikasi public headers directory
ditambahkan ke headers search list
.
Di bawah Xcode 4 direktori build dipindahkan ke ~/Library/Developer/Xcode/DerivedData/my-project
.
Masalahnya adalah bagaimana cara mereferensikan lokasi baru ini di pengaturan pencarian tajuk? Tampaknya:
public headers directory
relatif terhadapDerivedData
direktori, tetapiheaders search
direktori relatif terhadap sesuatu yang lain (mungkin lokasi proyek)
Bagaimana saya harus menyiapkan target perpustakaan statis untuk pengembangan iOS di Xcode 4 yang akan memastikan file header tersedia untuk klien yang menggunakan perpustakaan statis saat mencoba mengkompilasi sebagai ketergantungan?
sumber
Jawaban:
Setiap solusi yang saya lihat untuk masalah ini tampak tidak elegan (menyalin header ke dalam proyek aplikasi) atau terlalu disederhanakan hingga hanya berfungsi dalam situasi sepele.
Jawaban singkatnya
Tambahkan jalur berikut ke Jalur Pencarian Header Pengguna Anda
Mengapa ini berhasil?
Pertama, kita perlu memahami masalahnya. Dalam keadaan normal, yaitu ketika Anda Menjalankan, Menguji, Membuat Profil, atau Menganalisis, Xcode membuat proyek Anda dan meletakkan hasilnya di direktori Build / Products / Configuration / Products, yang tersedia melalui makro $ BUILT_PRODUCTS_DIR .
Sebagian besar panduan tentang pustaka statis menyarankan untuk menyetel Jalur Folder Header Publik ke $ TARGET_NAME , yang berarti bahwa file lib Anda menjadi $ BUILT_PRODUCTS_DIR /libTargetName.a dan header Anda dimasukkan ke dalam $ BUILT_PRODUCTS_DIR / TargetName. Selama aplikasi Anda menyertakan $ BUILT_PRODUCTS_DIR di jalur penelusurannya, impor akan berfungsi dalam 4 situasi yang diberikan di atas. Namun, ini tidak akan berfungsi saat Anda mencoba mengarsipkan.
Cara kerja pengarsipan sedikit berbeda
Saat Anda mengarsipkan proyek, Xcode menggunakan folder berbeda yang disebut ArchiveIntermediates. Di dalam folder itu Anda akan menemukan / YourAppName / BuildProductsPath / Release-iphoneos /. Ini adalah folder yang $ BUILT_PRODUCTS_DIR tunjuk saat Anda membuat arsip. Jika Anda melihat di sana, Anda akan melihat bahwa ada symlink ke file library statis yang Anda buat, tetapi folder dengan header tidak ada.
Untuk menemukan header (dan file lib) Anda harus pergi ke IntermediateBuildFilesPath / UninstalledProducts /. Ingat ketika Anda diberitahu untuk menyetel Lewati Pemasangan ke YA untuk pustaka statis? Nah, inilah efek pengaturan ketika Anda membuat arsip.
Catatan tambahan: Jika Anda tidak mengaturnya untuk melewati penginstalan, header Anda akan dimasukkan ke lokasi lain dan file lib akan disalin ke arsip Anda, mencegah Anda mengekspor file .ipa yang dapat Anda kirimkan ke App Store .
Setelah banyak mencari, saya tidak dapat menemukan makro yang sesuai dengan folder UninstalledProducts secara persis, oleh karena itu perlu membangun jalur dengan "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"
Ringkasan
Untuk pustaka statis Anda, pastikan Anda melewati penginstalan dan header publik Anda ditempatkan di $ TARGET_NAME.
Untuk aplikasi Anda, setel jalur penelusuran header pengguna Anda ke "$ (BUILT_PRODUCTS_DIR)", yang berfungsi dengan baik untuk build biasa, dan "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts", yang berfungsi untuk build arsip.
sumber
$(TARGET_BUILD_DIR)
. Bahkan saat mengarsipkan. ;)Saya mengalami masalah yang sama ini saat mengembangkan perpustakaan statis saya sendiri dan meskipun jawaban Colin sangat membantu, saya harus sedikit memodifikasinya agar berfungsi secara konsisten dan hanya saat menjalankan dan mengarsipkan proyek di bawah Xcode 4 menggunakan Ruang Kerja.
Yang berbeda tentang metode saya adalah Anda dapat menggunakan satu jalur tajuk pengguna untuk semua konfigurasi build Anda.
Metode saya adalah sebagai berikut:
Buat Ruang Kerja
Pengaturan Proyek Perpustakaan Statis
Saya telah mengadopsi ini dari penggunaan dengan RestKit dan menemukan itu bekerja paling baik dengan semua perpustakaan statis saya. Apa yang dilakukan ini adalah memberi tahu Xcode untuk menyalin semua tajuk yang kita pindahkan ke bagian tajuk "Publik" pada langkah 1 ke folder yang kita tentukan di sini yang berada di dalam folder Data Turunan saat membangun. Seperti RestKit, saya suka menggunakan satu folder "sertakan" untuk menampung setiap pustaka statis yang saya gunakan dalam sebuah proyek.
Saya juga tidak suka menggunakan makro di sini karena ini akan memungkinkan kita untuk menggunakan jalur pencarian tajuk pengguna nanti ketika kita mengonfigurasi proyek menggunakan pustaka statis.
Pengaturan untuk Proyek Menggunakan Perpustakaan Statis
Di area yang sama temukan Jalur Pencarian Header Pengguna dan tambahkan:
"$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include"
Ini memberi tahu Xcode untuk mencari pustaka statis di dalam folder build perantara yang dibuat Xcode selama proses build. Di sini, kami memiliki folder "termasuk" yang kami gunakan untuk lokasi perpustakaan statis kami yang kami siapkan pada langkah 2 untuk pengaturan proyek perpustakaan statis. Ini adalah langkah terpenting untuk mendapatkan Xcode agar dapat menemukan pustaka statis Anda dengan benar.
Konfigurasikan Ruang Kerja
Di sini kami ingin mengonfigurasi ruang kerja sehingga itu akan membangun perpustakaan statis saat kami membangun aplikasi kami. Ini dilakukan dengan mengedit skema yang digunakan untuk aplikasi kita.
Mulai Menggunakan Perpustakaan
Sekarang, Anda seharusnya dapat mengimpor pustaka statis Anda menggunakan
Metode ini mengatasi kerumitan karena harus memiliki jalur tajuk pengguna yang berbeda untuk konfigurasi yang berbeda, jadi Anda seharusnya tidak memiliki masalah dalam menyusun arsip.
Mengapa ini berhasil?
Itu semua tergantung pada jalan ini:
Karena kita mengkonfigurasi pustaka statis kita untuk menggunakan "Skip Install", file yang telah dikompilasi dipindahkan ke folder "UninstalledProjects" dalam direktori build sementara. Jalur kami di sini juga menentukan folder "sertakan" yang kami siapkan untuk perpustakaan statis kami dan digunakan untuk jalur pencarian tajuk pengguna kami. Keduanya bekerja bersama memungkinkan Xcode mengetahui di mana menemukan perpustakaan kami selama proses kompilasi. Karena direktori build sementara ini ada untuk konfigurasi Debug dan Rilis, Anda hanya memerlukan satu jalur Xcode untuk mencari pustaka statis.
sumber
Proyek Xcode 4 Gagal untuk mengkompilasi perpustakaan statis
Kesalahan mungkin termasuk; file header hilang, "masalah leksikal atau preprocessor"
Solusi:
sumber
Ini adalah utas yang sangat membantu. Dalam meneliti situasi saya sendiri, saya menemukan bahwa Apple memiliki dokumen 12 halaman tertanggal September 2012 berjudul "Menggunakan Perpustakaan Statis di iOS." Berikut tautan pdfnya: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf
Ini jauh lebih sederhana daripada kebanyakan diskusi Internet, dan dengan beberapa mod kecil untuk menjelaskan bagaimana pustaka eksternal yang saya gunakan dikonfigurasi, ini bekerja dengan baik untuk saya. Bagian terpenting mungkin adalah:
Saya yakin bahwa dalam banyak situasi yang ada, pendekatan Apple mungkin tidak cukup. Saya memposting ini di sini untuk siapa saja yang baru memulai perjalanan mereka di jalur taman perpustakaan statis - ini mungkin titik awal terbaik untuk kasus sederhana.
sumber
http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html
Menurut dokumentasi Apple:
Perpustakaan Anda akan memiliki satu atau beberapa file header yang perlu diimpor oleh klien perpustakaan tersebut. Untuk mengonfigurasi header mana yang diekspor ke klien, pilih project library Anda untuk membuka editor project, pilih target library untuk membuka editor target, dan pilih tab fase build. Jika target perpustakaan Anda memiliki fase build "Salin Header", Anda harus menghapusnya; fase pembuatan header copy tidak bekerja dengan benar dengan target perpustakaan statis saat melakukan tindakan "Arsip" di Xcode.
sumber
Lihatlah solusi Jonah Wlliam (tengah jalan ke bawah) & model GitHub (dalam komentar) untuk wawasan. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/
sumber
Tambahkan $ (OBJROOT) / UninstalledProducts / exactPathToHeaders ke Header Search Paths.
Untuk beberapa alasan kotak centang rekursif tidak berfungsi untuk saya dan saya harus menambahkan sisa jalur ke tempat tajuk berada.
Di bawah Log Navigator di Xcode (tab di sebelah kanan navigator break point) Anda dapat melihat riwayat pembuatan. Jika Anda memilih kegagalan build yang sebenarnya, Anda dapat memperluas detailnya untuk melihat setenv PATH dan memeriksa untuk memastikan jalur ke file header Anda ada di sana.
sumber
Tidak ada jawaban di atas yang berhasil untuk saya di Xcode 7 tetapi mereka memberi saya ide yang bagus. Untuk orang-orang yang berjuang di Xcode 7, saya memperbaikinya dengan menambahkan yang berikut ke Jalur Pencarian Header Pengguna (termasuk tanda kutip)
Ubah bagian URL relatif
usr/local/include
sesuai dengan apa yang ada di pengaturan 'Jalur Folder Header Publik' pustaka statissumber
Dalam kasus saya, ruang kerja saya memiliki beberapa proyek perpustakaan statis dan salah satunya memiliki ketergantungan termasuk file header dengan yang lain. Masalahnya adalah dengan tatanan bangunan. Di halaman edit Skema di bawah bagian Build, saya batal memilih opsi paralelisasi dan mengatur urutan target sesuai ketergantungan dan itu diselesaikan oleh masalah
sumber
Tambahkan jalur berikut ke Jalur Pencarian Header Pengguna Anda :
Ini diverifikasi!
sumber
Beresiko menunjukkan betapa bodohnya saya ... Saya menderita Xcode karena menolak menemukan file .h saya sepanjang sore.
Kemudian saya sadar.
Karena saya menggunakan "XCode 4", saya "dengan cerdas" memutuskan untuk meletakkan semua proyek saya di subfolder dari folder yang disebut " Proyek XCode 4 ".
Ruang-ruang di nama folder itu mengacaukan Xcode secara besar-besaran!
Mengganti nama folder ini menjadi " XCode_4_Projects " telah membawa kegembiraan (dan mengurangi umpatan) kembali ke dalam hidup saya.
Ingatkan saya lagi, tahun berapa ini?
Mungkin seseorang bisa memberi tahu pengembang Apple ...
sumber
Tak satu pun dari jawaban ini berhasil untuk saya. Inilah yang dilakukannya. Tambahkan yang berikut ini persis (salin dan tempel termasuk tanda kutip ganda) ke setelan build User Header Search Paths Anda :
Perhatikan penambahan subdirektori "/ include /" dibandingkan dengan jawaban lain. Seperti yang ditunjukkan pengguna lain, opsi "rekursif" tampaknya tidak melakukan apa-apa, jadi Anda dapat mengabaikannya.
Proyek saya sekarang dapat berhasil mengarsipkan ketika mengimpor file header perpustakaan statis dalam bentuk berikut:
Anda tidak perlu mengaktifkan pengaturan Always Search User Paths kecuali Anda menyertakan header perpustakaan statis Anda dengan tanda kurung siku (
#import <LibraryName/HeaderFile.h>
), tetapi Anda seharusnya tidak melakukannya dengan cara itu jika itu bukan header sistem / kerangka kerja.sumber
Ini adalah masalah terkait yang membawa saya ke pertanyaan ini, jadi saya menambahkan solusi saya hanya untuk dokumentasi / ini bisa menghemat waktu berjam-jam untuk berkeringat
File DropboxSDK.h tidak ditemukan
Setelah berhari-hari mencoba mendapatkan VES untuk dikompilasi untuk iOS saya akhirnya mengalami masalah ini. yang
DropboxSDK.h
jelas dalam jangkauansearch headers
saya bahkan ditambahkan keframework headers
path pencarian,include
d yang.h
langsung dan pergi ke segala macam keras untuk mencoba dan mendapatkanDropboxSDK.h
ditemukan.Larutan
EXPLICITY seret
DropboxSDK.framework
file ke XcodeProject Navigation
dan pastikanCopy Files if needed
dicentang. Pastikan juga target Anda diperiksa sesuai kebutuhan.Peringatan
Menyetel lokasi kerangka kerja eksplisit
build phases
tidak berhasil untuk saya. Saya harus menyeret .framework ke Xcode dan memastikan file disalin ke proyek saya.# mbp2015 # xcode7 # ios9
sumber
Ada berbagai cara kompleks untuk melakukan ini, dan beberapa solusi yang sangat cerdas diusulkan di utas ini.
Masalah utama dari semua solusi ini adalah sangat mengurangi portabilitas perpustakaan Anda.
Pilihan saya akhirnya hanya menggunakan kerangka kerja - selalu - seperti yang direkomendasikan oleh Apple (Video WWDC).
Ini sangat mudah dan melakukan pekerjaan yang sama pada akhirnya!
Solusi lain yang cukup elegan yang tampaknya berhasil adalah dengan menggunakan Cocoapods Pribadi. Cocoapods melakukan semua pekerjaan konfigurasi, salinan header dan sebagainya.
Kerangka batu!
sumber
simply use frameworks - always -
Inilah yang memecahkan masalah yang sama untuk saya.
Saya memiliki Target Aplikasi, dan Target Ekstensi iMessage. Kemudian saya memiliki 2 SDK (milik saya), yang ditautkan oleh Target Aplikasi.
Masalahnya adalah: target iMessage saya juga menggunakan 2 SDK saya (proyek terpisah), tetapi tidak tertaut dengannya dalam Build Phases -> Link Binary With Libraries. Saya harus menambahkan 2 SDK saya ke iMessage Target di sana, agar sesuai dengan target App saya, dan sekarang diarsipkan.
Jadi inti dari cerita ini adalah: Jika Anda memiliki beberapa target, seperti ekstensi, pastikan bahwa semua target Anda terhubung dengan perpustakaan yang mereka butuhkan. Itu dapat Membangun dan Menyebarkan ke Simulator dan Perangkat, tetapi tidak dapat Mengarsipkan.
sumber
Perbarui: Xcode 9
Jawaban di atas tidak berfungsi untuk saya menggunakan Xcode 9, tetapi jawaban ini bekerja dengan sempurna untuk saya. Saya telah menambahkan
$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include
ke "Jalur Pencarian Header" dan Xcode menautkan header pustaka statis saya tanpa masalah.sumber
Selamatkan diri Anda dari masalah dan lakukan ini = buat akun pengguna baru di Mac Anda - buka proyek di bawah akun pengguna baru - semua masalah hilang. Hemat waktu Anda dan jaga kewarasan Anda. semua balasan kutu buku itu tidak membantu !!
Semoga berhasil
sumber