Ada pertanyaan sebelumnya Tidak dapat mengkompilasi program C pada Mac setelah memutakhirkan ke Mojave , dan jawaban untuk itu telah mencakup sebagian besar variasi tentang apa yang salah.
Sekarang - pada Senin 2019-10-07 - Anda dapat meningkatkan ke macOS Catalina 10.15. Sekali lagi, selama upgrade, /usr/include
direktori telah dihancurkan oleh pembaruan, meskipun XCode 11.0 diinstal sebelum meningkatkan (dari Mojave 10.14.6) ke Catalina. Alhasil, kompiler yang dibangun berharap ada /usr/include
direktori yang tidak berfungsi lagi.
Langkah utama yang disarankan untuk masalah Mojave - menggunakan perintah:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
tidak berfungsi di luar gerbang karena direktori /Library/Developer/CommandLineTools/Packages/
tidak ada (jadi belum ada .pkg
file untuk dibuka).
Apakah ada cara (resmi) yang bagus untuk membuat dan mengisi direktori /usr/include
?
/usr/include
menggunakan alat pengembang Apple dengan Xcode Apple saat ini. Header dan semacamnya ada diXcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK
. (Mempertahankan header di direktori yang berbeda diperlukan untuk mendukung beberapa platform target, dan ada baiknya untuk tidak/usr/include
memastikan bahwa tidak ada kompilasi yang secara tidak sengaja menggunakan file darinya ketika menargetkan versi yang berbeda dari sistem host.) Apa yangxcode-select -p
ditampilkan untuk jalur ke direktori pengembang aktif?/usr/include
untuk header sistem. Saya ingin tetap dapat menggunakan itu, meskipun saya curiga bahwa Apple akhirnya membuang sisa-sisa terakhir kompatibilitas dengan sistem warisan Unix (sampai batas tertentu, tulisan ada di dinding dengan sistem yang diperlukan untuk membuat Mojave bekerja). '). Dalam hal ini, saya mungkin harus membangun kembali GCC yang menentukan lokasi header sistem saat ini entah bagaimana - bashing manual untuk cara mengkonfigurasi GCC.Jawaban:
Bagi saya menambahkan jalur berikut untuk
CPATH
menyelesaikan masalah:sumber
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
#include <stdlib.h>
dan kemudian gagal mengkompilasi mengeluh tentang:In file included from …/usr/include/sys/wait.h:110, —— from …/usr/include/stdlib.h:66, —— from bm.c:27: —— …/usr/include/sys/resource.h:443:9: error: no previous prototype for ‘getiopolicy_np’ [-Werror=missing-prototypes] —— 443 | int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
- Namun, ketika saya menambahkan#include <ctype.h>
sebelumnya#include <stdlib.h>
, mengkompilasi OK. Masih mencari tahu apa artinya ini dan bagaimana menanganinya secara otomatis.Sebelum Anda melanjutkan, pastikan untuk menginstal alat baris perintah xcode.
Sebenarnya, Anda bisa melakukannya! Sebenarnya semua header C ada di sini di folder ini:
Kami hanya perlu membuat symlink untuk semua file header ke folder ini:
Itu berhasil untuk saya! baris perintah berikut akan menangani semua masalah:
Anda akan mendapat peringatan. Beberapa tajuk sudah ada, seperti ini:
benar-benar oke untuk diabaikan. itu saja.
sumber
/usr/local/
hierarki direktori dimaksudkan untuk perangkat lunak lokal daripada perangkat lunak sistem. IMO, tajuknya harus ada/usr/include
dan Apple hanya menyusahkan./
dalam mode tulis. Kemudian Populasikan/usr/include
folder tersebut. Itu karena di 10.15, Sistem dipasang sebagai mode hanya baca. tanpa menonaktifkan SIP, Anda tidak akan dapat memasang volume Sistem.TL; DR
Tampaknya Apple menganggap
/usr/include
sebagai sesuatu yang telah berjalan seperti dodo - itu punah - atau mungkin seperti Monty Python Parrot .Menggunakan GCC yang disediakan Apple (sebenarnya, itu Dentang dengan nama lain, seperti yang ditunjukkan oleh informasi versi) atau Dentang menghindari masalah. Keduanya
/usr/bin/gcc
dan/usr/bin/clang
akan menemukan pustaka sistem empat level direktori di bawah ini:Jika Anda membangun GCC Anda sendiri atau kompiler lain, Anda (mungkin) harus mengkonfigurasinya untuk menemukan pustaka sistem di bawah direktori aplikasi Xcode.
Penjelajahan
Segera setelah upgrade, saya menjalankan XCode 11.0. Ia ingin menginstal beberapa komponen tambahan, jadi saya membiarkannya melakukannya. Namun, itu tidak mengembalikan
/usr/include
atau direktori di bawah/Library
.Salah satu nasihat lain dalam pertanyaan sebelumnya adalah menjalankan:
Ketika melakukannya, ia mengklaim bahwa ia mengunduh utilitas baris perintah, dan memastikan bahwa
/usr/bin/gcc
dan/usr/bin/clang
lain-lain ada. Itu langkah yang bermanfaat (meskipun saya tidak secara pasti memeriksa apakah mereka ada sebelumnya).Dengan menggunakan
/usr/bin/gcc
, sekarang memungkinkan untuk menyusun program:Namun,
/usr/include
masih hilang. Ada direktori di bawah/Library
sekarang:Baik itu
System
maupun yangLibrary
direktori direktori tidak mengandung sesuatu yang sangat menjanjikan.Ketika semuanya gagal, baca manualnya
Langkah selanjutnya - temukan dan baca catatan rilis:
Tidak ada informasi di sana yang berkaitan dengan ini. Jadi, kemungkinannya adalah (AFAICS, setelah hanya satu atau dua jam upaya) bahwa Apple tidak lagi mendukung
/usr/include
- meskipun masih memiliki penuh/usr/lib
(tidak/lib
sekalipun).Saatnya memeriksa kompilasi lain dengan opsi GCC yang
-v
ditambahkan (dalam makefile yang saya gunakan, pengaturanUFLAGS
menambahkan opsi ke baris perintah C compiler):Informasi utama dalam badai data adalah:
Itu secara efektif direktori 'root' untuk kompilasi, jadi harus ada sub-direktori di bawah itu untuk
usr
danusr/include
:Ini menunjukkan bahwa mil panjang nama direktori dan benar-benar tak terlupakan tidak mengandung header C dan POSIX standar, ditambah tambahan khusus Apple.
Direktori sebelumnya
/usr/local/
tampak utuh; peringatan tentangusr/local/include
tidak ada di bawah-isysrootdir
tidak berbahaya (dan tidak terlihat tanpa-v
opsi).sumber
wchar.h
tidak menemukan kesalahan. Saya mencoba memasukkan folder ini -I / Aplikasi / Xcode.app / Isi / Pengembang / Platform / MacOSX.platform / Pengembang / SDKs / MacOSX.sdk / usr / termasuk dan saya mendapatkan kesalahan lain seperti tentang simbol yang hilang untuk "kesalahan: tidak ada anggota bernama 'isless' di namespace global "--verbose
dalam file tugas dan perhatikan bahwa kode vs sedang melihat/usr/include/c++/v1/
folder yang tidak lagi ada sekarang di catalina. Menambahkan folder berikut juga bersama dengan SDK di atas termasuk dan sekarang berfungsi. "-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /",/usr/include
menghilang? Itu selalu secara implisit menjadi bagian dari compiler include path sehingga pengguna tidak perlu mengetahuinya (selain ketika Anda mencoba menemukan di mana sesuatu dinyatakan). Dentang melakukan hal yang sama dengan jalur SDK-nya di bawahXcode.app
sehingga efek bersihnya sama./usr/include
AWOL yang hilang adalah bahwa jika Anda telah membangun GCC Anda sendiri dari sumber, itu mungkin dikompilasi untuk menemukan header sistem/usr/include
dan karenanya kompilasi gagal. Saya ingin menggunakan GCC terbaru serta Dentang. Saya senang menggunakan Dentang Apple, tapi saya tidak senang menggunakan Dentang Apple yang menyamar sebagai GCC - tidak sama dengan GCC. Saya belum menyusun resep untuk membangun GCC dengan header sistem dipindahkan. (Saya pikir--with-native-system-header-dir="${XCODE_HDR}"
ini adalah bagian dari jawabannya; namun, itu bukan keseluruhan jawaban.)Setel
Make
variabel implisit berikut untuk menunjuk ke tempat header sekarang berada untuk Alat Baris Perintah Xcode (Xcode CLI):The
-isysroot
pilihan update lokasi file akar dari direktori sistem akar/
.Jadi, ini memastikan bahwa
/usr/*
file umum ditemukan di tempat baru mereka.Artinya, file di
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
sekarang ditemukan. File-file ini adalah:sumber
CFLAGS
jauh lebih kompleks dari satu opsi tunggal --isysroot
opsi harus 'selain' pengaturan lain (banyak pengaturan lain). Mungkin ada kernel ide di sini (lewat-isysroot
opsi dan lokasi di bawah/Library/Developer/…
), tetapi akan memerlukan beberapa pemolesan sebelum siap untuk prime time.export CFLAGS+=-isysroot ...
gantinya akan bekerja untuk kasus penggunaan itu. Ini adalah satu-satunya solusi yang bekerja untuk saya (pada Mojave (10.14) dengan Catalina (10.15) SDK. Saya tidak memiliki.pkg
file yang dibicarakan semua orang meskipun XCode dan alat-alat baris perintah saya mutakhir).CFLAGS=…
danCFLAGS+=…
.+=
. Terima kasih @Norswap.SDKROOT
ke nilai SDK yang sama (/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
) akan bekerja dengan baik untuk saya!Saya seorang pemula dengan C ++ compiler untuk R di OSX dan saya mendapat masalah yang sama bahwa C ++ tidak dapat menemukan header setelah OS diperbarui ( hilang math.h meskipun ada di sana ). Saya mengikuti instruksi dari https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ tapi tidak ada yang berubah.
Akhirnya, itu berhasil bagi saya setelah saya menginstal ulang Xcode CLI
dan kemudian ubah flag menjadi Var seperti yang disarankan @Coatless:
sumber
Dalam kasus saya, saya tampaknya memiliki
llvm
dangcc
juga menginstal menggunakan homebrew. Ketika saya menghapusnya, dan dengan demikian mengandalkan sepenuhnya pada macOS dentang, itu bisa menemukan header dan kompilasi bekerja lagi.sumber
Ketergantungan apue.h masih hilang pada saya
/usr/local/include
setelah mengikuti Komol Nath Roy menjawab dalam pertanyaan ini.Saya mengunduh dependensi secara manual dari git dan meletakkannya di
/usr/local/include
sumber
apue.h
berasal dari W Richard Stevens, Program Lanjutan Stephen A Rago di Lingkungan Unix, 3rd Edn 2013. AFAIK, itu tidak pernah disediakan oleh Apple sebagai header sistem. (Tidak ada di/usr/include
komputer saya yang masih menjalankan Mojave.) Jika pernah diinstal/usr/include
, mungkin dibuat secara manual daripada disediakan oleh Apple. Karena itu, seharusnya sudah diinstal/usr/local/include
sebelumnya./usr/include
?/usr/include
" - gunakan/usr/local/include
saja. Secara umum, paling aman untuk meninggalkan/usr/include
dan/usr/lib
sendirian, dan menambahkan bahan di bawah/usr/local
.Solusinya lebih sederhana daripada yang saya kira. Instal dentang / llvm.
Maka kita perlu membuat symlink sendiri.
Dan
Tergantung pada versi llvm Anda, ubah perintah di atas.
Sekarang, Anda dapat mengkompilasi program C ++ tanpa melewati flag kustom apa pun.
sumber
Saya mencoba 1) menghubungkan secara manual 2) menyeduh instal llvm, tetapi tidak berhasil.
Akhirnya, ini berhasil bagi saya: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
Dengan mengatur env vars berikut:
sumber
Bagi saya, ini berfungsi dengan baik sebagai berikut:
sumber