Nie można skompilować programu C na komputerze Mac po aktualizacji do Catalina 10.15


64

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/includekatalog 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/includekatalog, 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 .pkgpliku do otwarcia).

Czy istnieje dobry (oficjalny) sposób na utworzenie i wypełnienie katalogu /usr/include?


Nie musisz /usr/includeużywać narzędzi programistycznych Apple z bieżącym kodem Xcode firmy Apple. Nagłówki i takie są w Xcode.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/includedopilnować, aby żadne kompilacje nie wykorzystały przypadkowo plików z niego podczas celowania w wersję inną niż system hosta.) Co xcode-select -pwskazuje ścieżka do aktywny katalog programistów?
Eric Postpischil,

Zbudowałem GCC 9.2.0 (na Mojave) i spodziewa się, że będzie mógł używać /usr/includenagłó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.
Jonathan Leffler

1
@JonathanLeffler: Po aktualizacji do Cataliny mam również problem z brakiem niektórych plików (np. Stdlib.h), które są używane przez pakiet oprogramowania R podczas instalowania pakietów R. Próbowałem tego samego co ty dla macOS_10.14, ale nie jest to już możliwe. GCC, c ++ lub cokolwiek jest zainstalowane w / Library / Developer / CommandLineTools / usr / bin, ale R nie wie. Co mogę zrobić?
sebastiann

Od czasu aktualizacji do Cataliny jakiś tydzień temu stałem się ofiarą znanego obecnie problemu „podwójnego pisania” na nowych klawiaturach Maca, zmieniłem na zsh, zmieniłem zdanie i postanowiłem wrócić do bash i uaktualnij do wersji bash 5.0, teraz jestem tutaj, ponieważ nie mogę skompilować wersji bash 5.0. Zastanawiam się, czy poprawną odpowiedzią na ten problem nie jest po prostu zmniejszenie strat i przejście na Arch?
DryLabRebel

Jednym ze sposobów rozwiązania tego problemu jest użycie kompilatorów Xcode - jeśli są zainstalowane, wiedzą, gdzie znaleźć nagłówki systemowe. Wydaje się, że technika CPATH w przyjętej odpowiedzi działa dobrze. Jeszcze nie cierpiałem na komputerze Mac z powodu „podwójnego pisania” (o czym wiem). Mój iPhone zdecydował, że wpisałem wiele interesujących rzeczy, ale jak dotąd dotykać drewna, mój MacBook Pro był OK.
Jonathan Leffler

Odpowiedzi:


30

Dla mnie dodanie następującej ścieżki CPATHrozwiązania problemu:

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

Próbowałem dodać CPATH; jednak nadal pojawia się ten sam błąd. po prostu próbuję zrobić proste cout << „cześć”;
Jon Pellant,

1
Kiedy spróbowałem, zadziałało to w zwykłym teście z GCC 9.2.0 zbudowanym pod Mojave przy użyciu obecnego Xcode 11.1 - dziękuję.
Jonathan Leffler,

To zadziałało dla mnie z GCC 9.2.0_1
Sandeep

5
Jeśli używasz narzędzi wiersza poleceń zamiast Xcode.app, użyjexport CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
nalzok

Jeden kuriozum - Mam trochę kodu, który rozpoczął#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.
Jonathan Leffler

48

Zanim przejdziesz dalej, zainstaluj narzędzia wiersza polecenia xcode.

xcode-select --install

Właściwie możesz to zrobić! Właściwie wszystkie nagłówki C znajdują się tutaj w tym folderze:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/

Musimy tylko utworzyć dowiązanie symboliczne dla wszystkich plików nagłówków w tym folderze:

/usr/local/include/

To zadziałało dla mnie! następujący wiersz poleceń zajmie się wszystkimi problemami:

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

Dostaniesz ostrzeżenie. Niektóre nagłówki już istnieją, na przykład:

ln: /usr/local/include//tcl.h: File exists
ln: /usr/local/include//tclDecls.h: File exists
ln: /usr/local/include//tclPlatDecls.h: File exists
ln: /usr/local/include//tclTomMath.h: File exists
ln: /usr/local/include//tclTomMathDecls.h: File exists
ln: /usr/local/include//tk.h: File exists
ln: /usr/local/include//tkDecls.h: File exists
ln: /usr/local/include//tkPlatDecls.h: File exists

całkowicie ok, aby zignorować. to wszystko.


1
Tak, przypuszczam, że jest to możliwe - dziękuję za sugestię. Tak naprawdę nie spełnia moich wymagań dotyczących „higieny systemu” (np. Tych zduplikowanych nagłówków), a /usr/local/hierarchia katalogów jest przeznaczona raczej dla oprogramowania lokalnego niż oprogramowania systemowego. IMO, nagłówki powinny być, /usr/includea Apple po prostu boli.
Jonathan Leffler,

1
Jest na to sposób, może działać, możesz spróbować. W trybie odzyskiwania wyłącz SIP, a następnie podłącz /tryb zapisu. Następnie wypełnij /usr/includefolder. 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.
Roy,

@KomolNathRoy: dzięki za podpowiedzi. To działało dla mnie bardzo dobrze. W końcu mogłem zainstalować wszystkie moje poszukiwane pakiety w oprogramowaniu statystycznym R, ponieważ żaden R nie znajduje wszystkiego, czego potrzebuje do instalacji.
sebastiann

7
To rozwiązanie zadziałało dla mnie na Catalinie 10.15
Matthew Barbara

2
Wyłączenie SIP jest dla mnie nie do przyjęcia, nawet jako środek tymczasowy.
Jonathan Leffler,

22

TL; DR

Wydaje się, że Apple uważa /usr/includeza 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/gcci /usr/bin/clangznajdzie biblioteki systemowe cztery poziomy katalogów poniżej:

/Applications/Xcode.app/Contents/Developer/Platforms/…

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/includeto jednak katalogu ani katalogu /Library.

Jedną z innych rad z poprzedniego pytania było uruchomienie:

xcode-select --install

Robiąc to, twierdził, że pobrał narzędzia wiersza poleceń, i zapewnił, że /usr/bin/gcci /usr/bin/clangetc są obecne. To przydatny krok (chociaż nie sprawdziłem definitywnie, czy były wcześniej obecne).

$ /usr/bin/gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$

Za pomocą /usr/bin/gccmożna teraz kompilować programy:

$ make CC=/usr/bin/gcc al
co  RCS/al.c,v al.c
RCS/al.c,v  -->  al.c
revision 1.7
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith  -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN  -DHAVE_GETDELIM   -o al al.c -L/Users/jleffler/lib/64  -ljl
$

Jednak /usr/includenadal brakuje. /LibraryTeraz jest katalog :

$ ls /Library/Developer
CommandLineTools  PrivateFrameworks
$ ls /Library/Developer/CommandLineTools
Library SDKs    usr
$ ls /Library/Developer/CommandLineTools/SDKs
MacOSX.sdk      MacOSX10.14.sdk MacOSX10.15.sdk
$ ls /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/
Entitlements.plist SDKSettings.json   System
Library            SDKSettings.plist  usr
$

Ani katalog Systemani nie Libraryzawiera 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( /libchoć nie ).

Czas sprawdzić kolejną kompilację z -vdodaną opcją GCC (w używanym makefile ustawienie UFLAGSdodaje opcję do wiersza poleceń kompilatora C):

$ make UFLAGS=-v CC=/usr/bin/gcc ww
co  RCS/ww.c,v ww.c
RCS/ww.c,v  -->  ww.c
revision 4.9
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith  -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN  -DHAVE_GETDELIM -v  -o ww ww.c -L/Users/jleffler/lib/64  -ljl
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ww.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=10.15 -target-cpu penryn -dwarf-column-info -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 512.4 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I /Users/jleffler/inc -D HAVE_MEMMEM -D HAVE_STRNDUP -D HAVE_STRNLEN -D HAVE_GETDELIM -I/usr/local/include -O3 -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith -Wold-style-definition -Wcast-qual -Wstrict-prototypes -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -pedantic -std=c11 -fdebug-compilation-dir /Users/jleffler/src/cmd -ferror-limit 19 -fmessage-length 110 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=macosx-10.15.0 -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -x c ww.c
clang -cc1 version 11.0.0 (clang-1100.0.33.8) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /Users/jleffler/inc
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.15.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o ww -L/Users/jleffler/lib/64 /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -ljl -L/usr/local/lib -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil" -o ww.dSYM ww
$

Kluczowe informacje w tej zamieci danych to:

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

W rzeczywistości jest to katalog „główny” kompilacji, dlatego w podkatalogach for usri powinny znajdować się podkatalogi usr/include:

$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Entitlements.plist SDKSettings.json   System
Library            SDKSettings.plist  usr
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr
bin     include lib     libexec share
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
AppleTextureEncoder.h  dns_util.h             memory.h               simd
AssertMacros.h         dtrace.h               menu.h                 slapi-plugin.h
Availability.h         editline               miscfs                 spawn.h
AvailabilityInternal.h err.h                  module.modulemap       sqlite3.h
AvailabilityMacros.h   errno.h                monetary.h             sqlite3ext.h
AvailabilityVersions.h eti.h                  monitor.h              stab.h
lots more lines
dirent.h               mach-o                 security               xcselect.h
disktab.h              mach_debug             semaphore.h            xlocale
dispatch               machine                servers                xlocale.h
dlfcn.h                malloc                 setjmp.h               xpc
dns.h                  math.h                 sgtty.h                zconf.h
dns_sd.h               membership.h           signal.h               zlib.h
$

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 o usr/local/includenieistnieniu pod -isysrootdirjest nieszkodliwe (i niewidoczne bez -vopcji).


Niestety nie mogłem zastosować się do Twojej sugestii. Otrzymuję ten sam błąd w przypadku aktualizacji Catalina. Dzięki vscode nie mogłem budować aplikacji C ++ i wchar.hbłą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 ”
user3279954,

Włączone --verbosew 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 /”,
user3279954,

@trojanfoe — I prefer SCCS but in 1999 it wasn’t clear whether SCCS was going to work sanely post-Y2K (and there wasn’t a good open source implementation of SCCS that I knew of), so I reluctantly switched to RCS.
Jonathan Leffler

Wow: D W każdym razie, jaki jest problem z /usr/includezaginię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.appwięc efekt netto jest taki sam.
trojanfoe,

1
@trojanfoe: jednym problemem (moim głównym problemem) z nieistniejącym /usr/includeAWOL 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/includei 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ź.)
Jonathan Leffler,

7

Ustaw następujące Makezmienne niejawne , aby wskazywały, gdzie znajdują się teraz nagłówki dla narzędzi wiersza polecenia Xcode (CLI Xcode):

export CFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS+=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

-isysrootOpcja 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.sdksą teraz znalezione. Te pliki to:

Entitlements.plist 
Library
SDKSettings.json
SDKSettings.plist
System
usr

W moich plikach makefile (i większości innych plików makefile, które widzę) CFLAGSjest znacznie bardziej złożony niż jedna pojedyncza opcja - -isysrootopcja musiałaby być „oprócz” innych ustawień (wiele innych ustawień). Może istnieć jądro pomysłu (przekaż -isysrootopcję i położenie poniżej /Library/Developer/…), ale wymagałoby to dopracowania, zanim będzie gotowe na pierwszą porę.
Jonathan Leffler

@JonathanLeffler Używanie 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 .pkgpliku, o którym wszyscy mówią, mimo że mój XCode i narzędzia wiersza poleceń są aktualne).
Norswap

@Norswap - istnieje ogromna różnica między użyciem CFLAGS=…i CFLAGS+=….
Jonathan Leffler,

@JathanathanLeffler zgodził się. Zaktualizowałem odpowiedź do użycia +=. Dzięki @Norswap.
płaszczu

1
Alternatywnie, doszedłem do wniosku, że ustawienie SDKROOTtej samej wartości sdk ( /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) również będzie dla mnie działać!
Norswap,

4

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

xcode-select --install

a następnie zmień flagi na Var zgodnie z sugestią @Coatless:

export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

1

W moim przypadku zdawało się, że mam llvmi gcczainstalował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.


0

Zależność apue.h nadal była brakująca /usr/local/includepo 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


Nagłówek apue.hpochodzi 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/includena 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.
Jonathan Leffler

Przepraszam, moje naiwne pytanie, ale właśnie dostałem C ++ w tym tygodniu. Czy zależności / nagłówki są zarządzane ręcznie w c ++? jeśli tak, czy powinienem umieścić wszystkie wymienione zależności / nagłówki /usr/include?
Matthew Barbara

1
P1: Mniej więcej. Zależy to nieco od tego, co masz na myśli, ale musisz martwić się o zależności i nagłówki dla C lub C ++, jeśli nagłówki nie są standardowe na komputerach, z którymi pracujesz. Potem pojawia się pytanie - jaki jest standard? A najlepszą odpowiedzią na to pytanie jest „to zależy” i zależy od wielu czynników - w tym od „platformy” (O / S, kompilator). Pytanie 2 brzmi „Nie, zwykle nie powinieneś niczego umieszczać /usr/include” - /usr/local/includezamiast tego użyj . Ogólnie rzecz biorąc, jest to najbezpieczniejsza opuścić /usr/includei /usr/libsam, i dodać materiału pod /usr/localzamiast.
Jonathan Leffler

0

Rozwiązanie było prostsze niż myślałem. Zainstaluj clang / llvm.

brew install llvm

Następnie musimy sami stworzyć dowiązania symboliczne.

for f in /usr/local/Cellar/llvm/9.0.0_1/bin/clang*; do ln -s ${f} /usr/local/bin/"${f##*/}"; done

I

ln -s /usr/local/Cellar/llvm/9.0.0_1/include/c++ /usr/local/include/c++

W zależności od wersji llvm zmodyfikuj powyższe polecenia.

Teraz możesz kompilować programy C ++ bez przekazywania żadnych niestandardowych flag.

clang++ hello.cpp


0

Dla mnie działa to następująco:

1. xcode-select --install

2. sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

3. export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.