Nach dem Upgrade von Mojave auf Catalina, Setup: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk in der Umgebung.
Ich kann kein Programm kompilieren, das den <cmath>
Header verwendet.
Ich habe versucht, CFLAGS, CCFLAGS, CXXFLAGS so zu ändern, dass sie auf den MacOSSDK-Speicherort verweisen, der nichts ändert
Scanning dependencies of target OgreMain
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f OgreMain/CMakeFiles/OgreMain.dir/build.make OgreMain/CMakeFiles/OgreMain.dir/build
[ 0%] Building CXX object OgreMain/CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o
cd /Users/roman/Downloads/ogre-1.12.2/build/OgreMain && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DOgreMain_EXPORTS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OSX -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include/Threading -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src -I/Users/roman/Downloads/ogre-1.12.2/build/Dependencies/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include -I/Users/roman/Downloads/ogre-1.12.2/build/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain -isystem /usr/local/include -Wall -Winit-self -Wcast-qual -Wwrite-strings -Wextra -Wundef -Wmissing-declarations -Wno-unused-parameter -Wshadow -Wno-missing-field-initializers -Wno-long-long -Wno-inconsistent-missing-override -msse -O3 -DNDEBUG -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -o CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o -c /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp:29:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreStableHeaders.h:40:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgrePrerequisites.h:309:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgreStdHeaders.h:10:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:314:9: error: no member named 'signbit' in the global namespace
using ::signbit;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:315:9: error: no member named 'fpclassify' in the global namespace
using ::fpclassify;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:316:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
Zum Beispiel das Makro: isless
im globalen Namespace und auf meinem Computer vorhanden:
➜ cat math.h | grep "isless"
#define isless(x, y) __builtin_isless((x),(y))
#define islessequal(x, y) __builtin_islessequal((x),(y))
#define islessgreater(x, y) __builtin_islessgreater((x),(y))
➜ pwd
/usr/local/include
➜
Sogar der cmath-Header enthält Folgendes:
➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>
Und meine Kommandozeile hat die Option -isystem /usr/local/include
Das sollte funktionieren...
xcode-select -p
überein, wo sich Xcode befindet? Können Sie den Code ändernusing std::signbit;
, ebenfalls für die anderen? Kompilieren Sie als C ++ 11 oder höher?xcode-select -p
übereinstimmen woXCode
befindet sich.using ::signbit;
und das Symbol befindet sich nicht im globalen Namespace, sondern imstd::
Namespace. Ich nehme ebenfalls mit den anderen an (ich habe sie nicht verfolgt).Antworten:
Ich bin gespannt: Welchen Compiler verwenden Sie? Was ist der Wert von
CMAKE_OSX_SYSROOT
?Ich bin ziemlich davon überzeugt, dass dies das Ergebnis eines Unrechts ist
CMAKE_OSX_SYSROOT
. Ich hatte das Problem, das Sie beschreiben, wenn Sie Python-Bindungen für Clang verwenden (wobei CMake den Compiler-Aufruf nicht verwaltet), aber ich habe es geschafft, den Fehler in CMake folgendermaßen neu zu erstellen:Ich habe mein Problem gelöst, indem ich den Antworten auf diese Frage gefolgt bin: R-Pakete mit C ++ - Code können nach dem Update auf macOS Catalina nicht kompiliert werden .
Zusammenfassend: Auf Catalina
/usr/include
wird durch SIP gelöscht und geschützt. Daher kann jedes Projekt, das erwartet, dass die C-Header dort gefunden werden, nicht kompiliert werden. Wenn ich mich richtig erinnere, empfiehlt Apple, Fehlerberichte für Projekte einzureichen, in denen C-Header erwartet werden/usr/include
.Sie müssen das Build-System des Codes, den Sie kompilieren möchten, auf die richtigen Header verweisen:
(1) Stellen Sie sicher, dass Xcode auf dem neuesten Stand ist. Es ist nicht abzusehen, was ein veralteter Xcode auf Catalina für Ihre Build-Umgebung tun könnte.
(2) Verwenden Sie das
-isysroot /sdk/path
Compiler-Flag, wobei/sdk/path
das Ergebnis von istxcrun --show-sdk-path
. Ich bin mir nicht sicher, was CMakes Best Practice ist, aber versuchen Sie esoder
Wenn dies das Problem löst, möchten Sie möglicherweise nach einer besseren Möglichkeit suchen, dies in CMake zu tun.
Wenn Sie abenteuerlustig sind, können Sie natürlich auch SIP deaktivieren, wie in der Antwort auf meine Frage vorgeschlagen: / usr / include fehlt unter macOS Catalina (mit Xcode 11)
quelle
set(CMAKE_OSX_SYSROOT ...)
geht inCMakeLists.txt
, nicht die Schale.Ich habe das gleiche Problem beim Versuch, auf iOS abzuzielen (sowohl auf meinem MacBook Air als auch auf GitHub Actions Runner). Hier sind einige weitere Gedanken zu diesem Problem, obwohl ich mit dem Apple-Ökosystem nicht vertraut genug bin, um eine geeignete Lösung vorzuschlagen. Die ursprüngliche Befehlszeile kam von CMake in cpprestsdk, aber sobald ich sie auf das Wesentliche reduziert habe, ist hier ein kurzer Repro.
cmath-bug.cpp
mit der einzigen Zeile darin:Wenn ich es starte, werde ich vielen vertraut, die mit dem gleichen Problem konfrontiert sind:
Die einzigen 2 Include-Verzeichnisse, die ich an meine ursprüngliche Befehlszeile weitergebe, sind und sind:
Das Interessante dabei sind jedoch die nicht vorhandenen Include-Verzeichnisse, die gemeldet werden, sowie die Include-Verzeichnisse, die letztendlich durchsucht werden, und deren Reihenfolge. Ich vermute, dass zusätzliche Verzeichnisse, die nicht in der Befehlszeile aufgeführt sind, vom Apple Clang-Treiber basierend auf einer Apple-spezifischen Logik eingefügt werden.
Sie können dem gemeldeten Fehler entnehmen, dass der
<cmath>
Header gefunden wird in:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
und in Zeile 304 davon können Sie sehen:Gemessen an der Tatsache, dass sich in demselben Ordner
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
eine Datei befindetmath.h
, die die erforderlichen Definitionen enthält, z.Die Autoren von
<cmath>
erwarteten,math.h
dass derselbe Ordner zuerst aufgenommen wird und dann die#include_next <math.h>
Direktive die systemspezifische findetmath.h
. Das ist jedoch nicht das, was in der Realität passiert.Wenn Sie sich die ersten beiden Einträge in den gesuchten Verzeichnissen ansehen:
Sie sehen, dass das systemspezifische Include-Verzeichnis über dem von Clang injizierten Standardbibliotheksverzeichnis liegt, weshalb das systemspezifische Verzeichnis
math.h
gefunden wird und nicht das im selben Ordner wie die übrigen Standardbibliotheksheader. Dies ist wahrscheinlich der Fall, weil-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
das Problem behoben ist und ich die Datei kompilieren kann, wenn ich das Standardbibliotheks-Include-Verzeichnis explizit zu meiner Befehlszeile vor den beiden anderen Verzeichnissen hinzufüge . Dies ist nicht das, was Clangs Treiber oder was auch immer hier involviert ist, automatisch tut: Er fügt das Standardbibliotheksverzeichnis über hinzu-internal-system
(nicht sicher, wie die Semantik dieses internen Flags lautet ) und fügt es NACH dem Systemverzeichnis hinzu.Wenn Sie sich nun die Liste der ignorierten Verzeichnisse ansehen, lautet der allererste Eintrag in dieser Liste:
Der nachfolgende
c++/v1
Teil ist auf meinem Computer nicht vorhanden, sodass ich mich frage, ob die iPhone SDK-Installation einen symbolischen Linkc++
innerhalb des vorhandenen Teils des Pfads erstellen sollte, der auf das/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
Verzeichnis verweist, damit das Ganze funktioniert.Wie auch immer, das, was ich denke, passiert und ich frage mich, ob jemand weiß, wie man das richtig behebt?
Vielen Dank!
PS Für den Kontext:
quelle
Verwenden des Befehls:
meine #include <...> Suchsequenz:
Der Grund für den Fehler #include wird unten beschrieben:
Die Reparatur:
Ich habe die Option Nr. 2 befolgt und der Build ist jetzt erfolgreich!
Und danke an solodon für die ausführliche Antwort. Ich folgte der Antwort, um das Problem zu beheben.
quelle
Möglicherweise ist Ihre Kopie von Xcode beschädigt. Überprüfen Sie mit Codesign:
Dies ist mir passiert und das Problem war Xcode beschädigt. Neuinstallation behoben.
Etwas hatte Folgendes geändert:
math.h
war an allen oben genannten Stellen leer.quelle
Die Analyse von @ solodon ist genau richtig. Das Problem ist wahrscheinlich, dass die
cmath
Datei die falsche Version von enthältmath.h
basierend auf der Suchreihenfolge der Header-Dateien. Zumindest passierte mir das, als ich den gleichen Fehler bekam.Scannen Sie Ihre Compiler-Ausgabe nach
#include <...> search starts here:
. Sie können diese Ausgabe auch über die Befehlszeile mit (Quelle) erzwingen :Es sollte ungefähr so aussehen:
Beachten Sie, dass die Pfade mit
Toolchains
denen vor denen kommenPlatforms
. Wenn in Ihrem Fall die Reihenfolge umgekehrt ist, müssen Sie herausfinden, was in Ihrer Konfiguration dies verursacht. Für mich war es eine explizite EinstellungCPLUS_INCLUDE_PATH
in meinem Anmeldeskript.Beleidigender Code:
Dies war Teil meines Versuchs, Xcode 11 zu umgehen und das Installationspaket für die SDK-Header-Dateien nicht mehr bereitzustellen. Nachdem ich diesen Code entfernt hatte, konnte ich ihn erfolgreich einbinden
cmath
in meinen C ++ - Code aufnehmen.Wenn Sie hierher gekommen sind, um nach Lösungen für dieses Problem zu suchen, benötigen Sie möglicherweise eine andere Lösung. Dies hilft jedoch hoffentlich dabei, die Hauptursache für dieses Problem zu ermitteln, nämlich die Reihenfolge der Suchpfade für Header-Dateien.
quelle
Ich habe festgestellt, dass ich in meinem Projekt eine Datei habe
math.h
. Nach dem Umbenennen war das Problem verschwunden. Nähtecmath
enthalten meine Datei anstelle des Systems.quelle
Ich habe gerade diesen Fehler erhalten, als ich versucht habe, gRPC nach dem letzten Upgrade auf 10.15.4 und Xcode 11.4 zu kompilieren, und ich habe angefangen, mir alle angebotenen Lösungen anzusehen (hier und kann nach dem Upgrade auf Catalina 10.15 kein C-Programm auf einem Mac kompilieren ). und versuchte ein paar von ihnen (obwohl nicht versucht, neu zu erstellen
/usr/include
da dies die Trennung verletzen würde, die Apple zu erstellen versuchte) - nichts schien zu funktionieren.Ich habe mir dann die tatsächlichen Complier-Aufrufe, die der
make
Prozess erzeugte, genau angesehen und festgestellt, dass es eine explizite gabDies führte letztendlich dazu, dass die Includes in der falschen Reihenfolge ausgeführt wurden. Durch Entfernen dieses expliziten Include-Pfads konnte die Kompilierung mit einer Standardinstallation von Catalina, Xcode und den Xcode-Befehlszeilentools erfolgreich durchgeführt werden, wie zu erwarten, ohne weitere Tricks / Compiler-Flags erforderlich.
quelle
pkg-config
Dateien (z. B. libcurl) von Homebrew diesen Pfad automatisch hinzufügen, selbst wenn Sie Xcode installiert haben. Dies wurde in Homebrew 2.2.13 behoben. Weitere Details unter github.com/Homebrew/brew/issues/5068 ; PR, die dies behebt, befindet sich in github.com/Homebrew/brew/pull/7331 . TL; DR: Update HomebrewSie können versuchen, das CommandLineTools SDK anstelle des XCode.app SDK zu verwenden.
Ich behebe dieses Problem beim Kompilieren von PointCloudLibrary (PCL).
Außerdem kann eine Neuinstallation von XCode.app und CommandLineTools hilfreich sein.
quelle
Zusammenfassung: In meinem Fall verwendete das Build-Skript eine ältere Version der
ios-cmake
Toolchain (2.1.2), und durch Aktualisierung auf 3.1.2 wurde das Problem mit cmath / math include behoben.Anpassen des von @Ryan H. vorgeschlagenen raffinierten Befehls
gcc -Wp,-v -E -
für meinen Fall (clang, c ++, iOs target)ergibt zwei Catalina, darunter eine jungfräuliche, bei der nur XCode 11.14.1 installiert ist:
Der richtige Include-Pfad ist also der erste, der nicht ignoriert wird. Alles sollte in Ordnung sein, hat es aber nicht getan. Es scheint, dass das Problem durch einen zusätzlichen include-Befehl verursacht wurde, der von der ios-cmake-Toolchain an den Kompilierungsaufruf angehängt wurde:
Der Schuldige war die
-Isystem ...
Zeile, die dazu führt, dass die#include <math>
Zeile in der cmath-Datei die falsche Datei lädt. Nachdem ich viel herumgespielt hatte, um die cmake-Skripte zu reparieren, bemerkte ich die ältere Version von ios-cmake, und die Aktualisierung hatte den "einzigen" Effekt, die unerwünschte-Isystem
Zeile zu entfernen - alles andere war fast gleich (abgesehen von einigen Compiler-Optionen).quelle