Tidak dapat mengkompilasi program C pada Mac setelah meningkatkan ke Catalina 10.15


64

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/includedirektori 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/includedirektori 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 .pkgfile untuk dibuka).

Apakah ada cara (resmi) yang bagus untuk membuat dan mengisi direktori /usr/include?


Anda tidak perlu /usr/includemenggunakan alat pengembang Apple dengan Xcode Apple saat ini. Header dan semacamnya ada di Xcode.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/includememastikan bahwa tidak ada kompilasi yang secara tidak sengaja menggunakan file darinya ketika menargetkan versi yang berbeda dari sistem host.) Apa yang xcode-select -pditampilkan untuk jalur ke direktori pengembang aktif?
Eric Postpischil

Saya membangun GCC 9.2.0 (di Mojave) dan diharapkan dapat digunakan /usr/includeuntuk 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.
Jonathan Leffler

1
@ JonathanLeffler: Setelah pembaruan ke catalina saya juga menghadapi masalah bahwa beberapa file (seperti stdlib.h) hilang yang digunakan oleh paket perangkat lunak R ketika menginstal paket R. Saya mencoba hal yang sama seperti Anda untuk macOS_10.14, tetapi ini tidak mungkin lagi. GCC, c ++ atau apa pun yang diinstal di / Library / Developer / CommandLineTools / usr / bin, tetapi R tidak tahu. Apa yang dapat saya?
sebastiann

Sejak saya ditingkatkan ke Catalina sekitar seminggu yang lalu, saya telah menjadi korban dari masalah 'pengetikan ganda' yang sekarang terkenal di keyboard Mac baru, saya telah beralih ke zsh, berubah pikiran dan memutuskan untuk kembali ke bash dan tingkatkan ke bash5.0, sekarang saya di sini karena saya tidak dapat mengkompilasi bash5.0. Saya bertanya-tanya apakah jawaban yang benar untuk masalah ini bukan hanya memotong kerugian saya dan beralih ke Arch?
DryLabRebel

Salah satu cara mengatasi masalah adalah dengan menggunakan kompiler Xcode - jika mereka diinstal, mereka tahu di mana menemukan header sistem. Teknik CPATH dalam jawaban yang diterima juga tampaknya berfungsi dengan baik. Saya belum menderita di Mac karena 'pengetikan ganda' (yang saya tahu). IPhone saya sudah memutuskan saya mengetik semua hal yang menarik, tapi sejauh ini, sentuh kayu, MacBook Pro saya sudah oke.
Jonathan Leffler

Jawaban:


30

Bagi saya menambahkan jalur berikut untuk CPATHmenyelesaikan masalah:

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

Saya mencoba menambahkan CPATH; Namun, saya masih mendapatkan kesalahan yang sama. hanya mencoba melakukan cout sederhana << "halo";
Jon Pellant

1
Ketika saya mencoba ini, itu berhasil dalam tes kasual dengan GCC 9.2.0 dibangun di bawah Mojave menggunakan apa yang sekarang Xcode 11.1 - terima kasih.
Jonathan Leffler

Ini bekerja untuk saya dengan GCC 9.2.0_1
Sandeep

5
Jika Anda menggunakan alat-alat baris perintah alih-alih Xcode.app, gunakanexport CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
nalzok

Satu keanehan - Saya punya beberapa kode yang dimulai#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.
Jonathan Leffler

48

Sebelum Anda melanjutkan, pastikan untuk menginstal alat baris perintah xcode.

xcode-select --install

Sebenarnya, Anda bisa melakukannya! Sebenarnya semua header C ada di sini di folder ini:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/

Kami hanya perlu membuat symlink untuk semua file header ke folder ini:

/usr/local/include/

Itu berhasil untuk saya! baris perintah berikut akan menangani semua masalah:

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

Anda akan mendapat peringatan. Beberapa tajuk sudah ada, seperti ini:

ln: /usr/local/include//tcl.h: File exists
ln: /usr/local/include//tclDecls.h: File exists
ln: /usr/local/include//tclPlatDecls.h: File exists
ln: /usr/local/include//tclTomMath.h: File exists
ln: /usr/local/include//tclTomMathDecls.h: File exists
ln: /usr/local/include//tk.h: File exists
ln: /usr/local/include//tkDecls.h: File exists
ln: /usr/local/include//tkPlatDecls.h: File exists

benar-benar oke untuk diabaikan. itu saja.


1
Ya, saya kira ini mungkin - terima kasih atas sarannya. Itu tidak benar-benar cocok dengan persyaratan saya untuk 'kebersihan sistem' (misalnya, header duplikat) dan /usr/local/hierarki direktori dimaksudkan untuk perangkat lunak lokal daripada perangkat lunak sistem. IMO, tajuknya harus ada /usr/includedan Apple hanya menyusahkan.
Jonathan Leffler

1
Ada jalan keluar, semoga berhasil, Anda bisa mencoba. Dalam mode pemulihan, nonaktifkan SIP, lalu pasang /dalam mode tulis. Kemudian Populasikan /usr/includefolder tersebut. Itu karena di 10.15, Sistem dipasang sebagai mode hanya baca. tanpa menonaktifkan SIP, Anda tidak akan dapat memasang volume Sistem.
Roy

@KomolNathRoy: terima kasih atas petunjuk Anda. Ini bekerja dengan baik untuk saya. Saya akhirnya dapat menginstal semua paket yang saya inginkan di perangkat lunak statistik R, karena tidak ada R yang menemukan semua yang diperlukan untuk instalasi.
sebastiann

7
Solusi ini bekerja untuk saya di Catalina 10.15
Matthew Barbara

2
Menonaktifkan SIP tidak dapat diterima oleh saya, bahkan sebagai tindakan sementara.
Jonathan Leffler

22

TL; DR

Tampaknya Apple menganggap /usr/includesebagai 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/gccdan /usr/bin/clangakan menemukan pustaka sistem empat level direktori di bawah ini:

/Applications/Xcode.app/Contents/Developer/Platforms/…

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/includeatau direktori di bawah /Library.

Salah satu nasihat lain dalam pertanyaan sebelumnya adalah menjalankan:

xcode-select --install

Ketika melakukannya, ia mengklaim bahwa ia mengunduh utilitas baris perintah, dan memastikan bahwa /usr/bin/gccdan /usr/bin/clanglain-lain ada. Itu langkah yang bermanfaat (meskipun saya tidak secara pasti memeriksa apakah mereka ada sebelumnya).

$ /usr/bin/gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$

Dengan menggunakan /usr/bin/gcc, sekarang memungkinkan untuk menyusun program:

$ make CC=/usr/bin/gcc al
co  RCS/al.c,v al.c
RCS/al.c,v  -->  al.c
revision 1.7
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith  -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN  -DHAVE_GETDELIM   -o al al.c -L/Users/jleffler/lib/64  -ljl
$

Namun, /usr/includemasih hilang. Ada direktori di bawah /Librarysekarang:

$ ls /Library/Developer
CommandLineTools  PrivateFrameworks
$ ls /Library/Developer/CommandLineTools
Library SDKs    usr
$ ls /Library/Developer/CommandLineTools/SDKs
MacOSX.sdk      MacOSX10.14.sdk MacOSX10.15.sdk
$ ls /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/
Entitlements.plist SDKSettings.json   System
Library            SDKSettings.plist  usr
$

Baik itu Systemmaupun 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 /libsekalipun).

Saatnya memeriksa kompilasi lain dengan opsi GCC yang -vditambahkan (dalam makefile yang saya gunakan, pengaturan UFLAGSmenambahkan opsi ke baris perintah C compiler):

$ make UFLAGS=-v CC=/usr/bin/gcc ww
co  RCS/ww.c,v ww.c
RCS/ww.c,v  -->  ww.c
revision 4.9
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith  -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN  -DHAVE_GETDELIM -v  -o ww ww.c -L/Users/jleffler/lib/64  -ljl
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ww.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=10.15 -target-cpu penryn -dwarf-column-info -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 512.4 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I /Users/jleffler/inc -D HAVE_MEMMEM -D HAVE_STRNDUP -D HAVE_STRNLEN -D HAVE_GETDELIM -I/usr/local/include -O3 -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith -Wold-style-definition -Wcast-qual -Wstrict-prototypes -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -pedantic -std=c11 -fdebug-compilation-dir /Users/jleffler/src/cmd -ferror-limit 19 -fmessage-length 110 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=macosx-10.15.0 -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -x c ww.c
clang -cc1 version 11.0.0 (clang-1100.0.33.8) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /Users/jleffler/inc
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.15.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o ww -L/Users/jleffler/lib/64 /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -ljl -L/usr/local/lib -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil" -o ww.dSYM ww
$

Informasi utama dalam badai data adalah:

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

Itu secara efektif direktori 'root' untuk kompilasi, jadi harus ada sub-direktori di bawah itu untuk usrdan usr/include:

$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Entitlements.plist SDKSettings.json   System
Library            SDKSettings.plist  usr
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr
bin     include lib     libexec share
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
AppleTextureEncoder.h  dns_util.h             memory.h               simd
AssertMacros.h         dtrace.h               menu.h                 slapi-plugin.h
Availability.h         editline               miscfs                 spawn.h
AvailabilityInternal.h err.h                  module.modulemap       sqlite3.h
AvailabilityMacros.h   errno.h                monetary.h             sqlite3ext.h
AvailabilityVersions.h eti.h                  monitor.h              stab.h
lots more lines
dirent.h               mach-o                 security               xcselect.h
disktab.h              mach_debug             semaphore.h            xlocale
dispatch               machine                servers                xlocale.h
dlfcn.h                malloc                 setjmp.h               xpc
dns.h                  math.h                 sgtty.h                zconf.h
dns_sd.h               membership.h           signal.h               zlib.h
$

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 tentang usr/local/includetidak ada di bawah -isysrootdirtidak berbahaya (dan tidak terlihat tanpa -vopsi).


Maaf tidak bisa mengikuti saran Anda. Saya mendapatkan kesalahan yang sama dengan pembaruan catalina. Dengan vscode saya tidak bisa membuat aplikasi C ++ dan wchar.htidak 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 "
user3279954

Diaktifkan --verbosedalam 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 /",
user3279954

@trojanfoe - Saya lebih suka SCCS tetapi pada tahun 1999 tidak jelas apakah SCCS akan berfungsi dengan baik pasca-Y2K (dan tidak ada implementasi open source SCCS yang baik yang saya tahu), jadi saya dengan enggan beralih ke RCS.
Jonathan Leffler

Wow: D Jadi, apa masalahnya dengan /usr/includemenghilang? 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 bawah Xcode.appsehingga efek bersihnya sama.
trojanfoe

1
@trojanfoe: satu masalah (masalah utama saya) dengan /usr/includeAWOL yang hilang adalah bahwa jika Anda telah membangun GCC Anda sendiri dari sumber, itu mungkin dikompilasi untuk menemukan header sistem /usr/includedan 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.)
Jonathan Leffler

7

Setel Makevariabel implisit berikut untuk menunjuk ke tempat header sekarang berada untuk Alat Baris Perintah Xcode (Xcode CLI):

export CFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

The -isysrootpilihan 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.sdksekarang ditemukan. File-file ini adalah:

Entitlements.plist 
Library
SDKSettings.json
SDKSettings.plist
System
usr

Dalam makefile saya (dan sebagian besar makefile lain yang saya lihat), CFLAGSjauh lebih kompleks dari satu opsi tunggal - -isysrootopsi harus 'selain' pengaturan lain (banyak pengaturan lain). Mungkin ada kernel ide di sini (lewat -isysrootopsi dan lokasi di bawah /Library/Developer/…), tetapi akan memerlukan beberapa pemolesan sebelum siap untuk prime time.
Jonathan Leffler

@JonathanLeffler Menggunakan 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 .pkgfile yang dibicarakan semua orang meskipun XCode dan alat-alat baris perintah saya mutakhir).
Norswap

@Norswap - ada perbedaan besar antara penggunaan CFLAGS=…dan CFLAGS+=….
Jonathan Leffler

@JonathanLeffler setuju. Saya telah memperbarui jawaban untuk digunakan +=. Terima kasih @Norswap.
mantel

1
Atau, saya sudah tahu bahwa pengaturan SDKROOTke nilai SDK yang sama ( /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) akan bekerja dengan baik untuk saya!
Norswap

4

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

xcode-select --install

dan kemudian ubah flag menjadi Var seperti yang disarankan @Coatless:

export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

1

Dalam kasus saya, saya tampaknya memiliki llvmdan gccjuga menginstal menggunakan homebrew. Ketika saya menghapusnya, dan dengan demikian mengandalkan sepenuhnya pada macOS dentang, itu bisa menemukan header dan kompilasi bekerja lagi.


0

Ketergantungan apue.h masih hilang pada saya /usr/local/includesetelah mengikuti Komol Nath Roy menjawab dalam pertanyaan ini.

Saya mengunduh dependensi secara manual dari git dan meletakkannya di /usr/local/include


Header apue.hberasal 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/includekomputer 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/includesebelumnya.
Jonathan Leffler

Maafkan pertanyaan naif saya tapi saya baru saja mendapatkan C ++ minggu ini. Apakah dependensi / header dikelola secara manual dalam c ++? jika ya, haruskah saya memasukkan semua dependecies / header /usr/include?
Matius Barbara

1
Q1: Lebih atau kurang. Tergantung sedikit pada apa yang Anda maksud, tetapi Anda harus khawatir tentang dependensi dan header untuk C atau C ++ jika header tidak standar pada mesin yang Anda gunakan. Lalu muncul pertanyaan - apa standar? Dan tentang jawaban terbaik yang dapat diberikan adalah "itu tergantung", dan itu tergantung pada banyak faktor - termasuk 'platform' (O / S, compiler). Q2 adalah "Tidak, Anda seharusnya tidak memasukkan apa pun /usr/include" - gunakan /usr/local/includesaja. Secara umum, paling aman untuk meninggalkan /usr/includedan /usr/libsendirian, dan menambahkan bahan di bawah /usr/local.
Jonathan Leffler

0

Solusinya lebih sederhana daripada yang saya kira. Instal dentang / llvm.

brew install llvm

Maka kita perlu membuat symlink sendiri.

for f in /usr/local/Cellar/llvm/9.0.0_1/bin/clang*; do ln -s ${f} /usr/local/bin/"${f##*/}"; done

Dan

ln -s /usr/local/Cellar/llvm/9.0.0_1/include/c++ /usr/local/include/c++

Tergantung pada versi llvm Anda, ubah perintah di atas.

Sekarang, Anda dapat mengkompilasi program C ++ tanpa melewati flag kustom apa pun.

clang++ hello.cpp


0

Bagi saya, ini berfungsi dengan baik sebagai berikut:

1. xcode-select --install

2. sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

3. export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.