Warum fehlt /usr/include? Ich habe Xcode und Command Line Tools installiert (Mojave)

Ich habe gerade ein Upgrade von High Sierra auf Mojave durchgeführt und Xcode sowie seine Befehlszeilentools und zusätzliche Tools installiert. Nichts wird vom Terminal kompiliert, alles sagt /usr/include fehlt!

Ich habe überprüft und ALLE Dev-bezogenen Verzeichnisse unter /usr fehlen!

Irgendeine Idee, wie man es repariert?

Antworten (3)

Fügen Sie das -isysrootFlag zu Ihren Compiler-Flags hinzu, um automatisch das entsprechende SDK-Header-Verzeichnis einzuschließen und die Notwendigkeit für das /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgPaket zu vermeiden, das "in einer zukünftigen Version ... nicht mehr bereitgestellt wird".

Beispiele:

-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk

oder

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

Sie können verwenden xcrun --show-sdk-path, um den Standard-SDK-Pfad zu finden.

Sie können auch die von Xcode oder CommandLineTools installierten /usr/bin/-Versionen von clang, clang++, cc, c++, gcc, g++ verwenden, die Shims aufrufen, um das richtige Tool xcrunmit dem aktuellen SDK aufzurufen und Verzeichnisse einzuschließen. Dies ist standardmäßig CommandLineTools, wenn Sie das installiert haben.

Sie können das Verhalten ändern, um Xcode zu verwenden, indem Sie:

$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

oder zurückschalten:

$ sudo xcode-select -s /Library/Developer

Sie können auch verwenden -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk, wenn Sie nur die Standardeinstellung verwenden möchten. In den meisten Fällen sollten Sie jedoch wahrscheinlich untersuchen, warum der von Ihnen verwendete C-Compiler nicht die richtigen Flags aufnimmt (Sie sollten wahrscheinlich clangaus dem SDK verwenden, anstatt das, was Sie verwenden).

Sie müssen nach der Installation der Befehlszeilentools einen weiteren Schritt ausführen:

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

Warum? Apple hat ein neues Build-Tool Dance eingeführt - System-Includes werden jetzt nur noch unter einem bestimmten SDK-Pfad mit Xcode 10 und höher gehalten :

Das Command Line Tools-Paket installiert die macOS-Systemheader im macOS SDK. Software, die mit den installierten Tools kompiliert wird, sucht nach Headern im macOS SDK, das entweder

[...]

Die Befehlszeilentools durchsuchen standardmäßig das SDK nach Systemheadern. Einige Software kann jedoch möglicherweise nicht korrekt mit dem SDK erstellt werden und erfordert die Installation von macOS-Headern im Basissystem unter/usr/include [Hervorhebung hinzugefügt]. Wenn Sie der Betreuer einer solchen Software sind, empfehlen wir Ihnen, Ihr Projekt zu aktualisieren, damit es mit dem SDK funktioniert, oder einen Fehlerbericht für Probleme einzureichen, die Sie daran hindern. Als Problemumgehung wird ein zusätzliches Paket bereitgestellt, das die Header auf dem Basissystem installiert. In einer zukünftigen Version wird dieses Paket nicht mehr bereitgestellt. Sie finden dieses Paket unter:/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Um sicherzustellen, dass Sie die vorgesehene Version der Befehlszeilentools verwenden, führen Sie nach der Installation xcode-select -s <path to Xcode>oder aus xcode select -s /Library/Developer/CommandLineTools.

Nicholas Smith: Wie haben Sie das herausgefunden?
Ich habe nicht einmal ein Packages-Verzeichnis?!
Ich habe es irgendwann auf StackOverflow gesehen und es ist mir im Kopf geblieben.
Sie benötigen wahrscheinlich die Befehlszeilentools, bevor Sie dies versuchen. Siehe diese Antwort .
Möglicherweise müssen Sie verwenden sudo, damit dieser Befehl funktioniert
Wenn Sie dies tun, verschieben Sie nur das Unvermeidliche. Apple wird in der nächsten Version nicht einmal das Kompatibilitätspaket bereitstellen. Gewöhnen Sie sich jetzt daran, /usr/include nicht zu haben. Du brauchst es nicht.
Dies funktioniert nicht mehr mit Xcode 11.

Das "Warum" liegt darin, dass Apple es abgelehnt hat, ein /usr/include zu haben, das sich vom SDK unterscheidet. Sie sollten sich nicht darauf verlassen, dass es vorwärts geht.

Die Compiler wissen bereits, dass sie ihre Includes innerhalb des SDK finden, sodass das Verzeichnis /usr/include nicht mehr wirklich benötigt wird. Sie finden das Installationsverzeichnis des SDK für die Include-Dateien mitxcrun --show-sdk-path

Ist das irgendwo dokumentiert?
Außer der Tatsache, dass macOS unix04-zertifiziert ist (war).
Die Konformität mit der Single Unix Specification oder POSIX erfordert nicht, dass /usr/include im Dateisystem vorhanden ist.
Und ja, es ist in der SDK-Dokumentation dokumentiert.
die Compiler wissen es vielleicht, aber wie wäre es mit verschiedenen Konfigurationswerkzeugen, zB autoconf. Viele Autoconf-Makros werden mit der Annahme geschrieben, dass es etwas Sinnvolles in /usr gibt, glaube ich. Würde zB AC_CHECK_HEADER noch funktionieren?
Nun, MacPorts scheint gut zu laufen, obwohl die meisten Pakete autoconf verwenden. Wir hatten weniger als fünf kaputte Pakete von vielen Tausend.
@DimaPasechnik Nein, die meisten Autoconf-Makros kümmern sich nicht um /usr/include, und das sollten sie auch nicht: Was zählt, ist, dass Compiler sie finden können, nicht wo sie sind. Aus diesem Grund suchen Autoconf-Makros nicht nach Headern im Dateisystem, sondern kompilieren Testdateien, die sie enthalten.
@akim - viele Makros im Autoconf-Archiv suchen nach Dingen in /opt usw. Vgl. zB gnu.org/software/autoconf-archive/… (siehe zlib_places="/usr/local /usr /opt/local /sw"dort)
@DimaPasechnik Dieses Makro ist schlecht geschrieben. Es sollte nicht nach der Datei suchen, sondern prüfen, ob das Include funktioniert. Ich sagte "die meisten" :-)
Können Sie vorschlagen, wie es verbessert werden kann?
@Mark Re-Dokumentation: Diese Änderung / dieses Problem wird in den Versionshinweisen zu Xcode 10 erwähnt - "Jedoch kann einige Software möglicherweise nicht korrekt mit dem SDK erstellt werden und erfordert, dass macOS-Header im Basissystem unter /usr/include installiert werden. [. ..] Als Problemumgehung wird ein zusätzliches Paket bereitgestellt, das die Header auf dem Basissystem installiert.". Beachten Sie, dass die Problemumgehung NUR für Befehlszeilentools funktioniert.
@Anon Sie sollten diese Informationen in der Antwort bearbeiten