Jest poprzednie pytanie Nie można skompilować programu C na Macu po aktualizacji do Mojave , a odpowiedzi na to pytanie obejmowały większość wariantów tego, co poszło nie tak.
Teraz - od poniedziałku 2019-10-07 - możesz uaktualnić system do macOS Catalina 10.15. Ponownie, podczas aktualizacji, /usr/include
katalog został zdmuchnięty przez aktualizację, mimo że XCode 11.0 został zainstalowany przed aktualizacją (z Mojave 10.14.6) do Catalina. W związku z tym kompilatory zbudowane tak, aby oczekiwać, że istnieje /usr/include
katalog, już nie działają.
Główny zalecany krok w przypadku problemów z Mojave - użycie polecenia:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
nie działa poza bramą, ponieważ katalog /Library/Developer/CommandLineTools/Packages/
nie istnieje (więc nie ma jeszcze .pkg
pliku do otwarcia).
Czy istnieje dobry (oficjalny) sposób na utworzenie i wypełnienie katalogu /usr/include
?
/usr/include
używać narzędzi programistycznych Apple z bieżącym kodem Xcode firmy Apple. Nagłówki i takie są wXcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK
. (Przechowywanie nagłówków w różnych katalogach jest konieczne do obsługi wielu platform docelowych i dobrze jest nie/usr/include
dopilnować, aby żadne kompilacje nie wykorzystały przypadkowo plików z niego podczas celowania w wersję inną niż system hosta.) Coxcode-select -p
wskazuje ścieżka do aktywny katalog programistów?/usr/include
nagłówków systemowych. Chciałbym móc nadal z tego korzystać, ale podejrzewam, że Apple w końcu porzuciło ostatnie ślady zgodności ze starszymi systemami Unix (do pewnego stopnia napis był na ścianie z systemem wymaganym do działania Mojave) ”). W takim przypadku prawdopodobnie będę musiał przebudować GCC, podając w jakiś sposób bieżącą lokalizację nagłówków systemowych - ręczne bashowanie, jak skonfigurować GCC.Odpowiedzi:
Dla mnie dodanie następującej ścieżki
CPATH
rozwiązania problemu:źródło
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
#include <stdlib.h>
i wtedy nie udało się skompilowaćIn 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);
narzeka:- Jeszcze, kiedy dodać#include <ctype.h>
przed#include <stdlib.h>
, kompiluje OK. Wciąż pracuję nad tym, co to znaczy i jak sobie z tym poradzić automatycznie.Zanim przejdziesz dalej, zainstaluj narzędzia wiersza polecenia xcode.
Właściwie możesz to zrobić! Właściwie wszystkie nagłówki C znajdują się tutaj w tym folderze:
Musimy tylko utworzyć dowiązanie symboliczne dla wszystkich plików nagłówków w tym folderze:
To zadziałało dla mnie! następujący wiersz poleceń zajmie się wszystkimi problemami:
Dostaniesz ostrzeżenie. Niektóre nagłówki już istnieją, na przykład:
całkowicie ok, aby zignorować. to wszystko.
źródło
/usr/local/
hierarchia katalogów jest przeznaczona raczej dla oprogramowania lokalnego niż oprogramowania systemowego. IMO, nagłówki powinny być,/usr/include
a Apple po prostu boli./
tryb zapisu. Następnie wypełnij/usr/include
folder. Jest tak, ponieważ w wersji 10.15 system montuje się jako tryb tylko do odczytu. bez wyłączenia SIP nie będzie można zamontować woluminu systemowego.TL; DR
Wydaje się, że Apple uważa
/usr/include
za coś, która przeszła drogę dodo - to wymarły - a może to jest jak Monty Pythona Parrot .Używanie dostarczonego przez Apple GCC (tak naprawdę to Clang pod dowolną inną nazwą, jak pokazują informacje o wersji) lub Clang pozwala uniknąć problemów. Zarówno
/usr/bin/gcc
i/usr/bin/clang
znajdzie biblioteki systemowe cztery poziomy katalogów poniżej:Jeśli zbudujesz własny GCC lub inny kompilator, musisz (prawdopodobnie) skonfigurować go, aby znaleźć biblioteki systemowe w katalogu aplikacji Xcode.
Eksploracje
Natychmiast po aktualizacji uruchomiłem XCode 11.0. Chciał zainstalować dodatkowe komponenty, więc pozwoliłem na to. Nie przywróciło
/usr/include
to jednak katalogu ani katalogu/Library
.Jedną z innych rad z poprzedniego pytania było uruchomienie:
Robiąc to, twierdził, że pobrał narzędzia wiersza poleceń, i zapewnił, że
/usr/bin/gcc
i/usr/bin/clang
etc są obecne. To przydatny krok (chociaż nie sprawdziłem definitywnie, czy były wcześniej obecne).Za pomocą
/usr/bin/gcc
można teraz kompilować programy:Jednak
/usr/include
nadal brakuje./Library
Teraz jest katalog :Ani katalog
System
ani nieLibrary
zawiera niczego bardzo obiecującego.Gdy wszystko inne zawiedzie, przeczytaj instrukcję
Następny krok - znajdź i przeczytaj informacje o wersji:
Nie ma tam żadnych informacji na ten temat. Prawdopodobnie (AFAICS, po zaledwie godzinie lub dwóch wysiłkach) Apple już nie obsługuje
/usr/include
- choć nadal ma w pełni załadowany/usr/lib
(/lib
choć nie ).Czas sprawdzić kolejną kompilację z
-v
dodaną opcją GCC (w używanym makefile ustawienieUFLAGS
dodaje opcję do wiersza poleceń kompilatora C):Kluczowe informacje w tej zamieci danych to:
W rzeczywistości jest to katalog „główny” kompilacji, dlatego w podkatalogach for
usr
i powinny znajdować się podkatalogiusr/include
:To pokazuje, że długa na milę i całkowicie niepoznawalna nazwa katalogu zawiera standardowe nagłówki C i POSIX oraz dodatki specyficzne dla Apple.
Poprzedni
/usr/local/
katalog wydaje się nienaruszony; ostrzeżenie ousr/local/include
nieistnieniu pod-isysrootdir
jest nieszkodliwe (i niewidoczne bez-v
opcji).źródło
wchar.h
błąd nie został znaleziony. Próbowałem dołączyć ten folder -I / Applications / Xcode.app / Contents / Developer / Platforms / MacOSX.platform / Developer / SDKs / MacOSX.sdk / usr / include i iam otrzymuję inne błędy, takie jak brakujące symbole dla „error: no member nazwany „isless” w globalnej przestrzeni nazw ”--verbose
w pliku zadań i zauważyłem, że vs vs code szuka/usr/include/c++/v1/
folderu, który już nie istnieje w Catalina. Dodano również następujący folder wraz z powyższym sdk include i teraz działa. „-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /”,/usr/include
zaginięciem? Zawsze była domyślnie częścią ścieżki dołączającej kompilatora, więc użytkownik nigdy nie musiał o tym wiedzieć (poza tym, kiedy próbujesz znaleźć miejsce, gdzie coś zostało zadeklarowane). Clang robi to samo ze swoją ścieżką SDK pod,Xcode.app
więc efekt netto jest taki sam./usr/include
AWOL jest to, że jeśli zbudowałeś swój własny GCC ze źródła, prawdopodobnie został on skompilowany w celu znalezienia nagłówków systemowych/usr/include
i dlatego kompilacje nie powiodły się. Chcę używać najnowszego GCC, a także Clanga. Cieszę się, że używam Apple Clang, ale nie jestem szczęśliwy, że Apple Clang udaje GCC - to nie to samo co GCC. Nie opracowałem jeszcze przepisu na budowę GCC z przeniesionymi nagłówkami systemu. (Myślę, że--with-native-system-header-dir="${XCODE_HDR}"
jest to część odpowiedzi; nie jest to jednak cała odpowiedź.)Ustaw następujące
Make
zmienne niejawne , aby wskazywały, gdzie znajdują się teraz nagłówki dla narzędzi wiersza polecenia Xcode (CLI Xcode):-isysroot
Opcja aktualizuje położenie plików korzeniowych z dala od katalogu głównego systemu/
.To gwarantuje, że wspólne
/usr/*
pliki zostaną znalezione w ich nowym miejscu.Oznacza to, że pliki w
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
są teraz znalezione. Te pliki to:źródło
CFLAGS
jest znacznie bardziej złożony niż jedna pojedyncza opcja --isysroot
opcja musiałaby być „oprócz” innych ustawień (wiele innych ustawień). Może istnieć jądro pomysłu (przekaż-isysroot
opcję i położenie poniżej/Library/Developer/…
), ale wymagałoby to dopracowania, zanim będzie gotowe na pierwszą porę.export CFLAGS+=-isysroot ...
zamiast tego będzie działać dla tego przypadku użycia. Jest to jedyne rozwiązanie, które działało dla mnie (w Mojave (10.14) z pakietem Catalina (10.15) SDK. Nie mam.pkg
pliku, o którym wszyscy mówią, mimo że mój XCode i narzędzia wiersza poleceń są aktualne).CFLAGS=…
iCFLAGS+=…
.+=
. Dzięki @Norswap.SDKROOT
tej samej wartości sdk (/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
) również będzie dla mnie działać!Jestem nowicjuszem w kompilatorze C ++ dla R w OSX i mam ten sam problem, że C ++ nie mógł znaleźć nagłówka po aktualizacji OS ( brak pliku matematycznego.h, mimo że tam był ). Postępowałem zgodnie z instrukcjami z https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/, ale nic się nie zmieniło.
Wreszcie zadziałało to po ponownej instalacji interfejsu CLI Xcode
a następnie zmień flagi na Var zgodnie z sugestią @Coatless:
źródło
W moim przypadku zdawało się, że mam
llvm
igcc
zainstalowałem również za pomocą Homebrew. Kiedy je usunąłem i w ten sposób w pełni polegałem na macOS, mogłem znaleźć nagłówki i kompilacja znów działała.źródło
Zależność apue.h nadal była brakująca
/usr/local/include
po mojej odpowiedzi Komol Nath Roy na to pytanie.Pobrałem zależność ręcznie z git i umieściłem w niej
/usr/local/include
źródło
apue.h
pochodzi od W Richarda Stevensa, Stephen A Rago Advanced Programming in Unix Environment, 3. Edn 2013. AFAIK, nigdy nie został dostarczony przez Apple jako nagłówek systemowy. (Nie ma go/usr/include
na moim komputerze, na którym nadal działa Mojave). Jeśli raz go zainstalowano/usr/include
, prawdopodobnie został utworzony ręcznie, a nie dostarczany przez Apple. Jako taki powinien był zostać wcześniej zainstalowany/usr/local/include
./usr/include
?/usr/include
” -/usr/local/include
zamiast tego użyj . Ogólnie rzecz biorąc, jest to najbezpieczniejsza opuścić/usr/include
i/usr/lib
sam, i dodać materiału pod/usr/local
zamiast.Rozwiązanie było prostsze niż myślałem. Zainstaluj clang / llvm.
Następnie musimy sami stworzyć dowiązania symboliczne.
I
W zależności od wersji llvm zmodyfikuj powyższe polecenia.
Teraz możesz kompilować programy C ++ bez przekazywania żadnych niestandardowych flag.
źródło
Próbowałem 1) ręcznie połączyć 2) brew install llvm, ale nie działały.
Wreszcie zadziałało to dla mnie: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
Ustawiając następujące zmienne env:
źródło
Dla mnie działa to następująco:
źródło