Nach dem Upgrade auf Catalina 10.15 kann kein C-Programm auf einem Mac kompiliert werden


64

Es gibt eine frühere Frage: Nach dem Upgrade auf Mojave kann kein C-Programm auf einem Mac kompiliert werden. Die Antworten darauf haben die meisten Variationen der Fehler abgedeckt.

Ab Montag, dem 07.10.2019, können Sie jetzt ein Upgrade auf macOS Catalina 10.15 durchführen. Während des Upgrades wurde das /usr/includeVerzeichnis erneut durch das Update weggeblasen, obwohl XCode 11.0 vor dem Upgrade (von Mojave 10.14.6) auf Catalina installiert wurde. Folglich /usr/includefunktionieren Compiler, die so erstellt wurden, dass sie ein Verzeichnis erwarten, nicht mehr.

Der wichtigste empfohlene Schritt für die Mojave-Probleme - mit dem Befehl:

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

funktioniert nicht sofort, da das Verzeichnis /Library/Developer/CommandLineTools/Packages/nicht vorhanden ist (es muss also noch keine .pkgDatei geöffnet werden).

Gibt es eine gute (offizielle) Möglichkeit, das Verzeichnis zu erstellen und zu füllen /usr/include?


Sie müssen /usr/includedie Entwicklertools von Apple nicht mit dem aktuellen Xcode von Apple verwenden. Die Header und so sind in Xcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK. (Das Speichern von Headern in verschiedenen Verzeichnissen ist erforderlich, um mehrere Zielplattformen zu unterstützen, und es ist gut, nicht /usr/includesicherzustellen, dass keine Kompilierungen versehentlich Dateien daraus verwenden, wenn sie auf eine andere Version als das Hostsystem abzielen.) Was wird xcode-select -pfür den Pfad zu angezeigt ? das aktive Entwicklerverzeichnis?
Eric Postpischil

Ich habe GCC 9.2.0 (auf Mojave) erstellt und es wird erwartet, dass es /usr/includefür die Systemheader verwendet werden kann. Ich würde das gerne noch nutzen können, obwohl ich vermute, dass Apple endlich die letzten Spuren der Kompatibilität mit älteren Unix-Systemen weggeworfen hat (bis zu einem gewissen Grad war das Schreiben an der Wand mit dem System, das erforderlich ist, damit Mojave funktioniert '). In diesem Fall muss ich wahrscheinlich GCC neu erstellen und dabei den aktuellen Speicherort der System-Header angeben - manuelles Bashing für die Konfiguration von GCC.
Jonathan Leffler

1
@ JonathanLeffler: Nach dem Update auf Catalina habe ich auch das Problem, dass einige Dateien (wie stdlib.h) fehlen, die vom Softwarepaket R bei der Installation von R-Paketen verwendet werden. Ich habe das gleiche wie Sie für macOS_10.14 versucht, aber das ist nicht mehr möglich. GCC, c ++ oder was auch immer in / Library / Developer / CommandLineTools / usr / bin installiert ist, aber R weiß es nicht. Was kann ich machen?
Sebastiann

Seit ich vor ungefähr einer Woche ein Upgrade auf Catalina durchgeführt habe, bin ich ein Opfer des jetzt berüchtigten Problems der doppelten Eingabe auf den neuen Mac-Tastaturen geworden. Ich habe auf zsh umgestellt, meine Meinung geändert und mich entschlossen, wieder auf bash umzusteigen und Upgrade auf bash5.0, jetzt bin ich hier, weil ich bash5.0 nicht kompilieren kann. Ich frage mich, ob die richtige Antwort auf dieses Problem nicht darin besteht, meine Verluste zu reduzieren und zu Arch zu wechseln.
DryLabRebel

Eine Möglichkeit, das Problem zu umgehen, besteht darin, die Xcode-Compiler zu verwenden. Wenn sie installiert sind, wissen sie, wo sich die Systemheader befinden. Die CPATH-Technik in der akzeptierten Antwort scheint ebenfalls in Ordnung zu sein. Ich habe auf einem Mac noch nicht unter "Double Typing" gelitten (von dem ich weiß). Ich habe mein iPhone entscheiden lassen, dass ich alle möglichen interessanten Dinge geschrieben habe, aber bis jetzt war mein MacBook Pro in Ordnung.
Jonathan Leffler

Antworten:


30

Für mich das Hinzufügen des folgenden Pfades, um CPATHdas Problem zu lösen:

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

Ich habe versucht, den CPATH hinzuzufügen. Ich erhalte jedoch immer noch den gleichen Fehler. versuche nur ein einfaches cout zu machen << "hallo";
Jon Pellant

1
Als ich das ausprobierte, funktionierte es in einem Gelegenheitstest mit einem unter Mojave erstellten GCC 9.2.0 unter Verwendung des heutigen Xcode 11.1 - danke.
Jonathan Leffler

Dies funktionierte für mich mit GCC 9.2.0_1
Sandeep

5
Wenn Sie die Befehlszeilentools anstelle von Xcode.app verwenden, verwenden Sieexport CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
nalzok

Eine Kuriosität - Ich habe einen Code, der gestartet wurde#include <stdlib.h>und dann nicht kompiliert werden konnteIn 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);, wenn ich michbeschwert habe über:- Wenn ich jedoch#include <ctype.h>vorherhinzufüge#include <stdlib.h>, wird er in Ordnung kompiliert. Ich arbeite immer noch daran, was dies bedeutet und wie ich automatisch damit umgehen soll.
Jonathan Leffler

48

Bevor Sie fortfahren, stellen Sie sicher, dass Sie die xcode-Befehlszeilentools installieren.

xcode-select --install

Eigentlich kannst du es schaffen! Tatsächlich befinden sich alle C-Header hier in diesem Ordner:

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

Wir müssen nur einen Symlink für alle Header-Dateien in diesem Ordner erstellen:

/usr/local/include/

Es hat bei mir funktioniert! Die folgende Befehlszeile behebt alle Probleme:

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

Sie werden eine Warnung erhalten. Einige der Header sind bereits vorhanden:

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

völlig in Ordnung zu ignorieren. das ist alles.


1
Ja, ich denke das ist möglich - danke für den Vorschlag. Es entspricht nicht wirklich meinen Anforderungen an die Systemhygiene (z. B. diese doppelten Header), und die /usr/local/Verzeichnishierarchie ist eher für lokale Software als für Systemsoftware gedacht. IMO, die Header sollten drin sein /usr/includeund Apple ist nur ein Schmerz.
Jonathan Leffler

1
Es gibt einen Weg herum, kann funktionieren, Sie können es versuchen. Deaktivieren Sie im Wiederherstellungsmodus das SIP und stellen Sie den /Schreibmodus bereit. Dann füllen Sie den /usr/includeOrdner. Dies liegt daran, dass das System in 10.15 als schreibgeschützter Modus bereitgestellt wird. Ohne Deaktivierung des SIP können Sie das System-Volume nicht bereitstellen.
Roy

@KomolNathRoy: Danke für deine Hinweise. Das hat bei mir sehr gut funktioniert. Ich konnte endlich alle meine gewünschten Pakete in der Statistiksoftware R installieren, da kein R alles findet, was es für die Installation benötigt.
Sebastiann

7
Diese Lösung funktionierte für mich auf Catalina 10.15
Matthew Barbara

2
Das Deaktivieren des SIP ist für mich selbst als vorübergehende Maßnahme nicht akzeptabel.
Jonathan Leffler

22

TL; DR

Es scheint, dass Apple /usr/includeetwas betrachtet, das den Weg des Dodos gegangen ist - es ist ausgestorben - oder vielleicht ist es wie Monty Pythons Papagei .

Durch die Verwendung des von Apple bereitgestellten GCC (das ist Clang unter einem anderen Namen, wie die Versionsinformationen zeigen) oder Clang werden Probleme vermieden. Beide /usr/bin/gccund /usr/bin/clangfinden die Systembibliotheken vier Verzeichnisebenen unten:

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

Wenn Sie Ihren eigenen GCC oder einen anderen Compiler erstellen, müssen Sie ihn (wahrscheinlich) konfigurieren, um die Systembibliotheken im Xcode-Anwendungsverzeichnis zu finden.

Erkundungen

Unmittelbar nach dem Upgrade habe ich XCode 11.0 ausgeführt. Es wollte einige zusätzliche Komponenten installieren, also ließ ich es dies tun. Dies wurde jedoch nicht wiederhergestellt /usr/includeoder das Verzeichnis unter /Library.

Einer der anderen Ratschläge in der vorherigen Frage war:

xcode-select --install

Dabei wurde behauptet, dass die Befehlszeilen-Dienstprogramme heruntergeladen und sichergestellt wurden, dass /usr/bin/gccund /usr/bin/clangusw. vorhanden waren. Das ist ein nützlicher Schritt (obwohl ich nicht definitiv überprüft habe, ob sie vorher vorhanden waren).

$ /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
$

Mit /usr/bin/gcckönnen jetzt Programme programmiert werden:

$ 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
$

Fehlt /usr/includejedoch noch. Es gibt ein Verzeichnis unter /Library:

$ 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
$

Weder das Systemnoch das LibraryVerzeichnis enthalten etwas sehr Vielversprechendes.

Wenn alles andere fehlschlägt, lesen Sie das Handbuch

Nächster Schritt - Suchen und lesen Sie die Versionshinweise:

Es gibt dort keine Informationen, die sich darauf beziehen. Die Wahrscheinlichkeit ist also (AFAICS, nach nur ein oder zwei Stunden), dass Apple nicht mehr unterstützt /usr/include- obwohl es immer noch voll geladen ist /usr/lib(nein, /libobwohl).

Zeit, eine weitere Kompilierung mit -vhinzugefügter GCC-Option zu überprüfen (in dem von mir verwendeten Makefile UFLAGSfügt die Einstellung die Option zur C-Compiler-Befehlszeile hinzu):

$ 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
$

Die wichtigsten Informationen in diesem Datenblizzard sind:

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

Das ist effektiv das 'root'-Verzeichnis für die Kompilierung, daher sollte es Unterverzeichnisse für usrund geben 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
$

Dies zeigt, dass der kilometerlange und völlig unvergessene Verzeichnisname die Standard-C- und POSIX-Header sowie Apple-spezifische Extras enthält.

Das vorherige /usr/local/Verzeichnis scheint intakt zu sein. Die Warnung, dass usr/local/includeunter dem nicht vorhanden -isysrootdirist, ist harmlos (und ohne die -vOption nicht sichtbar ).


Entschuldigung, ich konnte Ihrem Vorschlag nicht folgen. Ich erhalte den gleichen Fehler mit dem Catalina-Update. Mit vscode konnte ich keine C ++ - Apps erstellen und es wurde wchar.hkein Fehler gefunden. Ich habe versucht, diesen Ordner -I / Applications / Xcode.app / Contents / Developer / Platforms / MacOSX.platform / Developer / SDKs / MacOSX.sdk / usr / include einzuschließen, und ich erhalte andere Fehler, z. B. fehlende Symbole für "error: no member" benannt 'isless' im globalen Namespace "
user3279954

Aktiviert --verbosein der Aufgaben - Datei und bemerkte , dass sich vs Code auf der Suche /usr/include/c++/v1/Ordner , die jetzt nicht mehr in catalina existieren. Der folgende Ordner wurde zusammen mit dem obigen SDK-Include hinzugefügt und jetzt funktioniert es. "-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /",
user3279954

@trojanfoe - Ich bevorzuge SCCS, aber 1999 war nicht klar, ob SCCS nach Y2K einwandfrei funktionieren würde (und es gab keine gute Open-Source-Implementierung von SCCS, von der ich wusste), und so wechselte ich widerwillig zu RCS.
Jonathan Leffler

Wow: D Also, was ist das Problem mit /usr/includedem Verschwinden? Es war immer implizit Teil des Compiler-Include-Pfads, sodass der Benutzer nie davon erfahren musste (außer wenn Sie versuchten, herauszufinden, wo etwas deklariert wurde). Clang macht dasselbe mit seinem SDK-Pfad unter, Xcode.appsodass der Nettoeffekt der gleiche ist.
Trojanfoe

1
@trojanfoe: Ein Problem (mein Hauptproblem) bei /usr/includeAWOL ist, dass wenn Sie Ihr eigenes GCC aus dem Quellcode erstellt haben, es wahrscheinlich kompiliert wurde, um die Systemheader zu finden, /usr/includeund daher die Kompilierungen fehlschlagen. Ich möchte sowohl das neueste GCC als auch Clang verwenden. Ich verwende gerne Apples Clang, aber ich verwende nicht gerne Apples Clang, der sich als GCC tarnt - es ist nicht dasselbe wie GCC. Ich habe noch kein Rezept für die Erstellung eines GCC mit verschobenen Systemheadern ausgearbeitet. (Ich denke, es --with-native-system-header-dir="${XCODE_HDR}"ist Teil der Antwort; es ist jedoch nicht die ganze Antwort.)
Jonathan Leffler

7

MakeStellen Sie die folgenden impliziten Variablen so ein, dass sie darauf verweisen, wo sich die Header jetzt für Xcode Command Line Tools (Xcode CLI) befinden:

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

Die -isysrootOption aktualisiert den Speicherort der Stammdateien außerhalb des Systemstammverzeichnisses /.

Dies stellt also sicher, dass die allgemeinen /usr/*Dateien an ihrem neuen Ort gefunden werden.

Das heißt, die Dateien bei /Library/Developer/CommandLineTools/SDKs/MacOSX.sdkwerden jetzt gefunden. Diese Dateien sind:

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

In meinen Makefiles (und den meisten anderen Makefiles, die ich sehe) CFLAGSist es viel komplexer als eine einzelne Option - die -isysrootOption müsste 'zusätzlich' zu den anderen Einstellungen (viele andere Einstellungen) sein. Möglicherweise gibt es hier einen Kernel einer Idee (übergeben Sie die -isysrootOption und den Speicherort darunter /Library/Developer/…), aber es müsste etwas poliert werden, bevor es zur Hauptsendezeit bereit ist.
Jonathan Leffler

@JonathanLeffler Die Verwendung von export CFLAGS+=-isysroot ...stattdessen funktioniert für diesen Anwendungsfall. Dies ist die einzige Lösung, die für mich funktioniert hat (unter Mojave (10.14) mit Catalina (10.15) SDK. Ich habe nicht die .pkgDatei, über die alle sprechen, obwohl meine XCode- und Befehlszeilentools auf dem neuesten Stand sind).
Norswap

@Norswap - es gibt einen großen Unterschied zwischen der Verwendung von CFLAGS=…und CFLAGS+=….
Jonathan Leffler

@ JonathanLeffler stimmte zu. Ich habe die Antwort aktualisiert, um sie zu verwenden +=. Danke @Norswap.
Mantel

1
Alternativ habe ich herausgefunden, dass die Einstellung SDKROOTauf denselben SDK-Wert ( /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) auch für mich funktioniert!
Norswap

4

Ich bin ein Neuling mit C ++ - Compiler für R in OSX und habe das gleiche Problem, dass C ++ den Header nach der Aktualisierung des Betriebssystems nicht finden konnte ( fehlende math.h, obwohl es dort war ). Ich habe die Anweisungen von https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ befolgt, aber nichts hat sich geändert.

Schließlich funktionierte es für mich, nachdem ich die Xcode-CLI neu installiert hatte

xcode-select --install

und ändern Sie dann die Flags in Var, wie von @Coatless vorgeschlagen:

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

In meinem Fall schien ich Homebrew zu haben llvmund gccauch zu installieren. Als ich diese entfernte und mich somit voll und ganz auf das MacOS-Klirren stützte, konnte es die Header finden und das Kompilieren funktionierte wieder.


0

apue.h Abhängigkeit fehlte immer noch in meiner, /usr/local/includenachdem ich Komol Nath Roy Antwort in dieser Frage gefolgt war .

Ich habe die Abhängigkeit manuell von git heruntergeladen und in platziert /usr/local/include


Der Header apue.hstammt von W. Richard Stevens, Stephen A. Rago Advanced Programming in der Unix-Umgebung, 3. Ausgabe 2013. AFAIK, er wurde von Apple nie als Systemheader bereitgestellt. ( /usr/includeAuf meinem Computer ist Mojave noch nicht ausgeführt.) Wenn es einmal installiert wurde /usr/include, wurde es wahrscheinlich manuell erstellt und nicht von Apple bereitgestellt. Als solches sollte es zuvor installiert /usr/local/includeworden sein.
Jonathan Leffler

Entschuldigen Sie meine naive Frage, aber ich habe diese Woche gerade C ++ in die Hände bekommen. Werden Abhängigkeiten / Header in C ++ manuell verwaltet? Wenn ja, sollte ich alle genannten Abhängigkeiten / Überschriften eingeben /usr/include?
Matthew Barbara

1
Q1: Mehr oder weniger. Es hängt ein wenig davon ab, was Sie meinen, aber Sie müssen sich über Abhängigkeiten und Header für C oder C ++ Gedanken machen, wenn die Header auf den Computern, mit denen Sie arbeiten, nicht Standard sind. Dann kommt die Frage - was ist Standard? Und die beste Antwort, die gegeben werden kann, ist "es kommt darauf an" und es hängt von vielen Faktoren ab - einschließlich "Plattform" (O / S, Compiler). Q2 lautet "Nein, normalerweise sollten Sie nichts eingeben /usr/include" - verwenden Sie /usr/local/includestattdessen. Im Allgemeinen ist es am sichersten, allein zu bleiben /usr/includeund stattdessen /usr/libMaterial darunter hinzuzufügen /usr/local.
Jonathan Leffler

0

Die Lösung war einfacher als ich dachte. Installieren Sie clang / llvm.

brew install llvm

Dann müssen wir selbst Symlinks erstellen.

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

Und

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

Ändern Sie abhängig von Ihrer llvm-Version die obigen Befehle.

Jetzt können Sie C ++ - Programme kompilieren, ohne benutzerdefinierte Flags zu übergeben.

clang++ hello.cpp


0

Für mich funktioniert es gut wie folgt:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.