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/include
Verzeichnis erneut durch das Update weggeblasen, obwohl XCode 11.0 vor dem Upgrade (von Mojave 10.14.6) auf Catalina installiert wurde. Folglich /usr/include
funktionieren 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 .pkg
Datei geöffnet werden).
Gibt es eine gute (offizielle) Möglichkeit, das Verzeichnis zu erstellen und zu füllen /usr/include
?
/usr/include
die Entwicklertools von Apple nicht mit dem aktuellen Xcode von Apple verwenden. Die Header und so sind inXcode.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/include
sicherzustellen, dass keine Kompilierungen versehentlich Dateien daraus verwenden, wenn sie auf eine andere Version als das Hostsystem abzielen.) Was wirdxcode-select -p
für den Pfad zu angezeigt ? das aktive Entwicklerverzeichnis?/usr/include
fü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.Antworten:
Für mich das Hinzufügen des folgenden Pfades, um
CPATH
das Problem zu lösen:quelle
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
#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.Bevor Sie fortfahren, stellen Sie sicher, dass Sie die xcode-Befehlszeilentools installieren.
Eigentlich kannst du es schaffen! Tatsächlich befinden sich alle C-Header hier in diesem Ordner:
Wir müssen nur einen Symlink für alle Header-Dateien in diesem Ordner erstellen:
Es hat bei mir funktioniert! Die folgende Befehlszeile behebt alle Probleme:
Sie werden eine Warnung erhalten. Einige der Header sind bereits vorhanden:
völlig in Ordnung zu ignorieren. das ist alles.
quelle
/usr/local/
Verzeichnishierarchie ist eher für lokale Software als für Systemsoftware gedacht. IMO, die Header sollten drin sein/usr/include
und Apple ist nur ein Schmerz./
Schreibmodus bereit. Dann füllen Sie den/usr/include
Ordner. 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.TL; DR
Es scheint, dass Apple
/usr/include
etwas 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/gcc
und/usr/bin/clang
finden die Systembibliotheken vier Verzeichnisebenen unten: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/include
oder das Verzeichnis unter/Library
.Einer der anderen Ratschläge in der vorherigen Frage war:
Dabei wurde behauptet, dass die Befehlszeilen-Dienstprogramme heruntergeladen und sichergestellt wurden, dass
/usr/bin/gcc
und/usr/bin/clang
usw. vorhanden waren. Das ist ein nützlicher Schritt (obwohl ich nicht definitiv überprüft habe, ob sie vorher vorhanden waren).Mit
/usr/bin/gcc
können jetzt Programme programmiert werden:Fehlt
/usr/include
jedoch noch. Es gibt ein Verzeichnis unter/Library
:Weder das
System
noch dasLibrary
Verzeichnis 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,/lib
obwohl).Zeit, eine weitere Kompilierung mit
-v
hinzugefügter GCC-Option zu überprüfen (in dem von mir verwendeten MakefileUFLAGS
fügt die Einstellung die Option zur C-Compiler-Befehlszeile hinzu):Die wichtigsten Informationen in diesem Datenblizzard sind:
Das ist effektiv das 'root'-Verzeichnis für die Kompilierung, daher sollte es Unterverzeichnisse für
usr
und gebenusr/include
: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, dassusr/local/include
unter dem nicht vorhanden-isysrootdir
ist, ist harmlos (und ohne die-v
Option nicht sichtbar ).quelle
wchar.h
kein 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 "--verbose
in 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 /",/usr/include
dem 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.app
sodass der Nettoeffekt der gleiche ist./usr/include
AWOL ist, dass wenn Sie Ihr eigenes GCC aus dem Quellcode erstellt haben, es wahrscheinlich kompiliert wurde, um die Systemheader zu finden,/usr/include
und 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.)Make
Stellen 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:Die
-isysroot
Option 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.sdk
werden jetzt gefunden. Diese Dateien sind:quelle
CFLAGS
ist es viel komplexer als eine einzelne Option - die-isysroot
Option müsste 'zusätzlich' zu den anderen Einstellungen (viele andere Einstellungen) sein. Möglicherweise gibt es hier einen Kernel einer Idee (übergeben Sie die-isysroot
Option und den Speicherort darunter/Library/Developer/…
), aber es müsste etwas poliert werden, bevor es zur Hauptsendezeit bereit ist.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.pkg
Datei, über die alle sprechen, obwohl meine XCode- und Befehlszeilentools auf dem neuesten Stand sind).CFLAGS=…
undCFLAGS+=…
.+=
. Danke @Norswap.SDKROOT
auf denselben SDK-Wert (/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
) auch für mich funktioniert!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
und ändern Sie dann die Flags in Var, wie von @Coatless vorgeschlagen:
quelle
In meinem Fall schien ich Homebrew zu haben
llvm
undgcc
auch 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.quelle
apue.h Abhängigkeit fehlte immer noch in meiner,
/usr/local/include
nachdem 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
quelle
apue.h
stammt 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/include
Auf 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/include
worden sein./usr/include
?/usr/include
" - verwenden Sie/usr/local/include
stattdessen. Im Allgemeinen ist es am sichersten, allein zu bleiben/usr/include
und stattdessen/usr/lib
Material darunter hinzuzufügen/usr/local
.Die Lösung war einfacher als ich dachte. Installieren Sie clang / llvm.
Dann müssen wir selbst Symlinks erstellen.
Und
Ändern Sie abhängig von Ihrer llvm-Version die obigen Befehle.
Jetzt können Sie C ++ - Programme kompilieren, ohne benutzerdefinierte Flags zu übergeben.
quelle
Ich habe versucht 1) manuell zu verknüpfen 2) brauen install llvm, aber sie haben nicht funktioniert.
Schließlich funktionierte dies für mich: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
Durch Einstellen der folgenden Umgebungsvariablen:
quelle
Für mich funktioniert es gut wie folgt:
quelle