Po aktualizacji do Catalina z Mojave, Konfiguracja: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk w środowisku.
Nie mogę skompilować programu używającego <cmath>
nagłówka.
Próbowałem zmienić CFLAGS, CCFLAGS, CXXFLAGS, aby wskazywały lokalizację MacOSSDK, która niczego nie zmienia
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;
na przykład makro: isless
jest obecne w globalnej przestrzeni nazw i na moim komputerze:
➜ 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
➜
Nawet nagłówek cmath zawiera:
➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>
A moja linia poleceń ma opcję -isystem /usr/local/include
To powinno działać ...
xcode-select -p
pasuje do lokalizacji Xcode? Czy możesz zmienić kodusing std::signbit;
również na inne? Czy kompilujesz jako C ++ 11 lub nowszy?xcode-select -p
dopasuj gdzieXCode
się znajduje.using ::signbit;
a symbol nie znajduje się w globalnej przestrzeni nazw, lecz wstd::
przestrzeni nazw. Przypuszczam, że podobnie jest z innymi (nie ścigałem ich).Odpowiedzi:
Jestem ciekawy: jakiego kompilatora używasz? Jaka jest wartość
CMAKE_OSX_SYSROOT
?Jestem dość przekonany, że jest to wynikiem zła
CMAKE_OSX_SYSROOT
. Miałem problem, który opisujesz, używając powiązań Pythona do clang (gdzie CMake nie zarządza wywołaniem kompilatora), ale udało mi się odtworzyć błąd w CMake, wykonując:Rozwiązałem swój problem, postępując zgodnie z odpowiedziami na to pytanie: Nie można skompilować pakietów R z kodem c ++ po aktualizacji do macOS Catalina .
Podsumowując: Na Catalinie
/usr/include
jest oczyszczony i chroniony przez SIP. W związku z tym każdy projekt, który spodziewa się tam znaleźć nagłówki C, nie zostanie skompilowany. Jeśli dobrze pamiętam, Apple zaleca plików raportów o błędach do projektów, które oczekują na nagłówki C/usr/include
.Musisz wskazać system kompilacji kodu, który próbujesz skompilować, na właściwe nagłówki:
(1) Upewnij się, że Xcode jest aktualny. Nie wiadomo, co może zrobić przestarzały Xcode na Catalinie w środowisku kompilacji.
(2) Użyj
-isysroot /sdk/path
flagi kompilatora, gdzie/sdk/path
jest wynikiemxcrun --show-sdk-path
. Nie jestem pewien, jaka jest najlepsza praktyka CMake, ale spróbuj to zrobićlub
Jeśli to rozwiąże problem, możesz poszukać lepszego sposobu na zrobienie tego w CMake.
Oczywiście, jeśli masz ochotę na przygodę, możesz również wyłączyć SIP, jak sugerowano w odpowiedzi na moje pytanie: / usr / include missing na macOS Catalina (z Xcode 11)
źródło
set(CMAKE_OSX_SYSROOT ...)
wchodzi doCMakeLists.txt
, nie do muszli.Mam ten sam problem podczas próby kierowania na iOS (zarówno na moim MacBooku Air, jak i na gitarze GitHub Actions) i oto kilka innych przemyśleń na ten temat, chociaż nie znam wystarczająco ekosystemu Apple, aby zaproponować właściwe rozwiązanie. Oryginalna linia komend pochodziła z CMake w cpprestsdk, ale kiedy już wszystko sprowadziłem do niezbędności, oto krótkie repro.
cmath-bug.cpp
z jedyną linią:Kiedy go uruchamiam, zapoznaję wielu z tym samym problemem:
Istnieją tylko dwa katalogi, które przekazuję w moim oryginalnym wierszu poleceń i są to:
Ale interesujące są tutaj nieistniejące katalogi, które zgłasza, a także katalogi, które ostatecznie przeszukują i ich kolejność. Domyślam się, że dodatkowe katalogi niewymienione w wierszu poleceń są wstawiane przez sterownik Apple Clang w oparciu o logikę specyficzną dla Apple.
Na podstawie zgłoszonego błędu można zobaczyć, że
<cmath>
nagłówek został znaleziony w:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
a w wierszu 304 można zobaczyć:Sądząc po tym, że w tym samym folderze
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
znajduje się plikmath.h
zawierający niezbędne definicje, np .:autorzy
<cmath>
spodziewali się,math.h
że najpierw z tego samego folderu zostaną dołączeni, a następnie#include_next <math.h>
dyrektywa znajdzie specyficzne dla systemumath.h
. W rzeczywistości jednak tak się nie dzieje.Jeśli spojrzysz na pierwsze 2 wpisy w przeszukiwanych katalogach:
widać, że specyficzny dla systemu katalog włączania kończy się powyżej standardowego katalogu biblioteki wstrzykiwanego przez Clanga, dlatego właśnie znajduje się specyficzny dla systemu katalog, a
math.h
nie ten w tym samym folderze, co pozostałe standardowe nagłówki bibliotek. Jest tak prawdopodobnie dlatego, że jeśli wyraźnie dodam standardowy katalog dołączania biblioteki do mojego wiersza poleceń PRZED pozostałymi dwoma katalogami-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
problem zniknie i będę mógł skompilować plik. Nie robi to automatycznie sterownik Clanga ani cokolwiek innego, co jest tutaj zaangażowane: dodaje ten standardowy katalog biblioteki poprzez-internal-system
(nie jestem pewien, co to jest semantyka tej wewnętrznej flagi) i dodaje go PO katalogu systemowym.Teraz, jeśli spojrzysz na listę ignorowanych katalogów, pierwszy wpis na tej liście to:
którego końcowa
c++/v1
część nie istnieje na moim komputerze, co sprawia, że zastanawiam się, czy instalacja iPhone SDK miała stworzyć symboliczne łączec++
wewnątrz istniejącej części ścieżki, aby wskazać/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
katalog, aby wszystko działało.W każdym razie to, co myślę, dzieje się i zastanawiam się, czy ktoś wie, jak to naprawić?
Dziękuję Ci!
PS W kontekście:
źródło
Możliwe, że twoja kopia Xcode jest uszkodzona. Sprawdź za pomocą kodu:
To mi się przydarzyło, a problem był uszkodzony Xcode. Ponowna instalacja naprawiła to.
Coś zmodyfikowało następujące:
math.h
był pusty we wszystkich powyższych miejscach.źródło
Analiza @ solodon jest natychmiastowa. Problem prawdopodobnie
cmath
dotyczy nieprawidłowej wersji pliku namath.h
podstawie kolejności wyszukiwania plików nagłówkowych. Przynajmniej tak się działo, gdy otrzymywałem ten sam błąd.Przeskanuj dane wyjściowe kompilatora
#include <...> search starts here:
. Możesz również wymusić to wyjście z wiersza poleceń za pomocą (source) :Powinno to wyglądać mniej więcej tak:
Zauważ, że ścieżki z
Toolchains
są przed tymi zPlatforms
. Jeśli w twoim przypadku kolejność jest odwrócona, musisz dowiedzieć się, co powoduje to w twojej konfiguracji. Dla mnie było to jawne ustawienieCPLUS_INCLUDE_PATH
w moim skrypcie logowania.Obraźliwy kod:
To była część mojej próby obejścia Xcode 11, która nie zapewniała już pakietu instalacyjnego dla plików nagłówkowych SDK. Po usunięciu tego kodu udało mi się z powodzeniem dołączyć
cmath
do mojego kodu C ++.Jeśli przyszedłeś tutaj, szukając rozwiązań tego problemu, możesz potrzebować innego rozwiązania, ale mam nadzieję, że to pomoże rzucić światło na to, co wydaje się być główną przyczyną tego problemu, kolejność ścieżek wyszukiwania plików nagłówkowych.
źródło
Za pomocą polecenia:
moja #include <...> sekwencja wyszukiwania:
Przyczyna błędu #include została opisana poniżej:
Poprawka:
Postępowałem zgodnie z opcją nr 2 i kompilacja jest teraz udana!
I dzięki Solodon za szczegółową odpowiedź. Postępowałem zgodnie z odpowiedzią, aby rozwiązać problem.
źródło
Odkryłem, że w moim projekcie mam plik
math.h
. Po zmianie nazwy problem zniknął. Szwycmath
zawierają mój plik zamiast systemu.źródło
Właśnie dostałem ten błąd podczas próby kompilacji gRPC po niedawnej aktualizacji do 10.15.4 i Xcode 11.4 i zacząłem patrzeć na wszystkie oferowane rozwiązania (tutaj i nie mogę skompilować programu C na Macu po aktualizacji do Catalina 10.15 ) i wypróbowałem kilka z nich (choć nie próbowałem odtworzyć,
/usr/include
ponieważ naruszałoby to separację, którą Apple próbował stworzyć) - nic nie działało.Następnie przyjrzałem się dokładnie faktycznym wezwaniom do komplementacji, które
make
produkował ten proces, i zauważyłem, że istnieje wyraźnyto ostatecznie spowodowało, że dołączenia wystąpiły w niewłaściwej kolejności - usunięcie tej wyraźnej ścieżki włączania pozwoliło kompilacji na pomyślne zakończenie domyślnej instalacji catalina, Xcode i narzędzi wiersza poleceń Xcode, jak można się spodziewać, żadnych innych flag / trików / kompilatora potrzebne.
źródło
pkg-config
pliki (np. Libcurl) z Homebrew automatycznie dodają tę ścieżkę, nawet jeśli masz zainstalowany Xcode. Zostało to naprawione w Homebrew 2.2.13. Więcej informacji na github.com/Homebrew/brew/issues/5068 ; PR, który to naprawia, znajduje się w github.com/Homebrew/brew/pull/7331 . TL; DR: Aktualizacja homebrewMożesz spróbować użyć CommandLineTools SDK zamiast XCode.app SDK.
Rozwiązuję ten problem podczas kompilacji PointCloudLibrary (PCL)
Ponownie zainstaluj XCode.app i CommandLineTools może pomóc.
źródło
Podsumowanie: w moim przypadku skrypt kompilacji używał starszej wersji
ios-cmake
toolchain (2.1.2), a zaktualizowanie go do wersji 3.1.2 naprawiło problem dołączania cmath / matematyki.Dostosowanie fajnego polecenia zaproponowanego przez @Ryan H.
gcc -Wp,-v -E -
w moim przypadku (clang, c ++, iOs target)daje dwie Cataliny, w tym dziewiczą, w której jedynym zainstalowanym narzędziem jest XCode 11.14.1:
Więc poprawna ścieżka dołączania jest pierwszą niezignorowaną, wszystko powinno działać OK, ale nie zadziałało. Wygląda na to, że problem pochodzi z dodatkowego polecenia dołączania dołączonego do wywołania kompilacji przez łańcuch narzędzi ios-cmake:
Winowajcą była
-Isystem ...
linia, która spowoduje, że#include <math>
linia w pliku cmath skończy się ładowaniem niewłaściwego pliku. Po wielu próbach poprawiania skryptów cmake zauważyłem starszą wersję ios-cmake, a jej aktualizacja miała „jedyny” efekt usunięcia niechcianej-Isystem
linii - wszystko inne było prawie takie samo (oprócz kilku opcji kompilatora)źródło