Не удается скомпилировать программу C на Mac после обновления до Catalina 10.15
Был предыдущий вопрос: " Невозможно скомпилировать программу C на Mac после обновления до Mojave", и ответы на него охватывают большинство вариантов того, что идет не так.
Теперь - с понедельника 2019-10-07 - вы можете перейти на macOS Catalina 10.15. Еще раз, во время обновления/usr/include
каталог был поражен обновлением, хотя XCode 11.0 был установлен до обновления (с Mojave 10.14.6) до Catalina. Следовательно, компиляторы рассчитаны на то, что существует/usr/include
каталог больше не работает.
Основной рекомендуемый шаг для проблем с Мохаве - использование команды:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
не работает из-за ворот, потому что каталог /Library/Developer/CommandLineTools/Packages/
не существует (так что еще нет .pkg
файл для открытия).
Есть ли хороший (официальный) способ создать и заполнить каталог /usr/include
?
16 ответов
Для меня добавление следующего пути к CPATH
решил вопрос:
export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
Прежде чем продолжить, обязательно установите инструменты командной строки xcode.
xcode-select --install
Собственно, вы можете это сделать! На самом деле все заголовки C находятся здесь, в этой папке:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
Нам просто нужно создать символическую ссылку для всех файлов заголовков в этой папке:
/usr/local/include/
У меня это сработало! следующая командная строка позаботится обо всех проблемах:
sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/
Вы получите предупреждение. Некоторые из заголовков уже существуют, например:
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
полностью нормально игнорировать. вот и все.
TL;DR
Похоже, что Apple считает /usr/include
как что-то, что пошло по пути дронта - он вымер - или, может быть, это как Попугай Монти Пайтона.
Использование предоставленного Apple GCC (на самом деле это Clang под любым другим именем, как показывает информация о версии) или Clang позволяет избежать проблем. Обе/usr/bin/gcc
а также /usr/bin/clang
найдет системные библиотеки на четырех уровнях каталогов ниже:
/Applications/Xcode.app/Contents/Developer/Platforms/…
Если вы создаете свой собственный GCC или другой компилятор, вам (вероятно) потребуется настроить его для поиска системных библиотек в каталоге приложения Xcode.
Исследования
Сразу после обновления я запустил XCode 11.0. Он хотел установить дополнительные компоненты, поэтому я позволил ему это сделать. Однако это не восстановило/usr/include
или каталог под /Library
.
Еще один совет в предыдущем вопросе заключался в следующем:
xcode-select --install
При этом он утверждал, что загрузил утилиты командной строки, и гарантировал, что /usr/bin/gcc
а также /usr/bin/clang
и т. д. присутствовали. Это полезный шаг (хотя я не проверял, присутствовали ли они раньше).
$ /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
$
С помощью /usr/bin/gcc
, теперь можно компилировать программы:
$ 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
$
Однако, /usr/include
все еще отсутствует. Под/Library
сейчас:
$ 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
$
Ни System
ни Library
каталог содержит что-нибудь очень многообещающее.
Когда ничего не помогает, прочтите руководство
Следующий шаг - найдите и прочтите примечания к выпуску:
Там нет никакой информации, касающейся этого. Таким образом, вероятность (AFAICS, после всего лишь часа или двух усилий), что Apple больше не поддерживает/usr/include
- хотя у него все еще есть полностью загруженный /usr/lib
(нет /lib
хотя).
Пора проверить другую компиляцию с опцией GCC -v
добавлен (в make-файле, который я использовал, установка UFLAGS
добавляет параметр в командную строку компилятора 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
$
Ключевая информация в этом потоке данных:
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Фактически это "корневой" каталог для компиляции, поэтому в нем должны быть подкаталоги для usr
а также 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
$
Это показывает, что длинное и полностью незапоминаемое имя каталога действительно содержит стандартные заголовки C и POSIX, а также специфические для Apple дополнения.
Предыдущий /usr/local/
каталог не поврежден; предупреждение оusr/local/include
не существует под -isysrootdir
безвреден (и не виден без -v
вариант).
Установите следующие неявные Make
переменные, указывающие, где теперь находятся заголовки для инструментов командной строки Xcode (Xcode CLI):
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
В -isysroot
опция обновляет расположение корневых файлов вне корневого каталога системы/
.
Таким образом, это гарантирует, что общий /usr/*
файлы находятся на новом месте.
То есть файлы в /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
теперь найдены. Вот эти файлы:
Entitlements.plist
Library
SDKSettings.json
SDKSettings.plist
System
usr
В MacOS Catalina 10.15.4 с Xcode версии 11.5 (11E608c) мне также нужно было обновить путь к библиотеке в моем.zshrc (пути MacOSX.sdk новые):
export CPATH='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include:/opt/local/include'
export LIBRARY_PATH='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib:/opt/local/lib'
Я новичок в использовании компилятора C++ для R в OSX, и у меня возникла та же проблема, что C++ не мог найти заголовок после обновления ОС (отсутствует math.h, хотя он был там). Я выполнил инструкции https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/, но ничего не изменилось.
Наконец, у меня это сработало после того, как я переустановил Xcode CLI.
xcode-select --install
а затем измените флаги на Var, как предложил @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
Если у вас установлены как инструменты командной строки, так и XCode, убедитесь, что SDK, установленный инструментами командной строки, действительно используется:
# Проверить текущий SDK
$ xcrun --show-sdk-path
#Change sdk
$ sudo xcode-select -s /Library/Developer/CommandLineTools #Using CommandLineTools SDK
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer #Using XCode.app SDK
Престижность /questions/53013615/catalina-c-ispolzovanie-zagolovkov-and-ltcmath-and-gt-privodit-k-oshibke-net-ele/53013628#53013628 за этот ответ.
Для меня это хорошо работает следующим образом:
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
В моем случае у меня было llvm
а также gcc
также устанавливается с помощью homebrew. Когда я удалил их и, таким образом, полностью полагался на clang macOS, он смог найти заголовки, и компиляция снова заработала.
Короткий ответ
/Library/Developer/CommandLineTools/usr/bin/clang++ -o main main.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk
Объяснение
В текущей версии macOS заголовки c/ C++ ищутся внутри /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/
, вместо того /usr/include
. Поэтому вам нужно "сбросить" корневой каталог, используя-isysroot
вариант.
Надеюсь, это имеет смысл.
Если вы используете внешнюю установку LLVM, добавьте их в свой
~/.bash_profile
export PATH="/Users/your_user_name/Downloads/llvm/bin:$PATH"
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
export LD_LIBRARY_PATH="/Users/your_user_name/Downloads/llvm/lib/:$LD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH="/Users/your_user_name/Downloads/llvm/lib/:$DYLD_LIBRARY_PATH"
export CPATH="/Users/your_user_name/Downloads/llvm/lib/clang/11.0.0/include/"
(отрегулируйте версию clang и путь установки внешнего llvm.)
Тогда беги
source ~/.bash_profile
В моем случае я сделал миллионы вещей, но считаю, что следующие шаги помогли исправить установку Ruby.
xcode-select --install
- Установите эти флаги
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
sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/
export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
rbenv install 2.6.3 -v
Зависимость apue.h все еще отсутствовала в моем /usr/local/include
после того, как ответит на этот вопрос Комол Нат Рой.
Я загрузил зависимость вручную из git и поместил ее в /usr/local/include
Для меня ошибка была:
xcrun[20873:1179298] Failed to open macho file at /Library/Developer/CommandLineTools/usr/bin/clang++ for reading: Too many levels of symbolic links
Итак, я открыл свой терминал и перешел в следующую папку (как указано в сообщении об ошибке):
/Library/Developer/CommandLineTools/usr/bin/
Затем я удалил файл ярлыка с именем
sudo rm clang++
Затем я сделал копию исполняемого файла с именем
clang
и переименовал скопированный файл в
clang++
sudo cp clang clang++
И наконец это работает.
Решение оказалось проще, чем я думал. Установите clang / llvm.
brew install llvm
Затем нам нужно самому создать символические ссылки.
for f in /usr/local/Cellar/llvm/9.0.0_1/bin/clang*; do ln -s ${f} /usr/local/bin/"${f##*/}"; done
А также
ln -s /usr/local/Cellar/llvm/9.0.0_1/include/c++ /usr/local/include/c++
В зависимости от вашей версии llvm измените приведенные выше команды.
Теперь вы можете компилировать программы на C++, не передавая никаких пользовательских флагов.
clang++ hello.cpp
Я пробовал 1) вручную связать 2) brew install llvm, но они не работали.
Наконец, это сработало для меня: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
Установив следующие переменные env:
export CC=clang
export CXX=clang++
export MACOSX_DEPLOYMENT_TARGET=10.9