Не могу скомпилировать программу C на Mac после обновления до Мохаве

159

Я использовал команду gcc на терминале для компиляции программ на Си, но внезапно, после обновления ОС моего Mac (до macOS 10.14 Mojave и XCode 10.0), я начал получать сообщение:

test.c:8:10: fatal error: stdio.h: No such file or directory
#include <stdio.h>
         ^~~~~~~~~
compilation terminated.

Я уже установил gcc, так как я могу найти его, /usr/local/binи там действительно есть gcc. Я попытался запустить тот же файл на моем другом iMac, и он работал без проблем.

Я попытался запустить, xcode-select --installи он уже был установлен, следовательно, это не решило проблему, которую я имею сейчас. Я предполагаю, что путь испорчен, так как не похоже, что его можно найти gccпосле того, как я начал копировать и вставлять некоторые команды из других ресурсов для решения этой проблемы.

Хотелось бы помочь с этим.

Maxxx
источник
5
Вы можете проверить пути поиска gcc, используяecho "#include <a.h>" | gcc -v -x c -
Matt
2
Очень часто xocde-select --installэто правильное решение. Какие o / s вы обновили до? Мохаве 10,14? Какой XCode у вас установлен? 10.0 или другая версия?
Джонатан Леффлер
39
@JonathanLeffler Я нашел способ. Если мы используем XCode 10, вы заметите, что если вы перейдете к / usr в Finder, вы больше не увидите папку с именем include, поэтому терминал жалуется на отсутствие заголовочных файлов, которые содержатся внутри папка include В этом заявлении о выпуске developer.apple.com/documentation/xcode_release_notes/… (перейдите к /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg и запустите этот пакет, чтобы установить папку «include»). Тогда тебе должно быть хорошо идти.
Maxxx
1
Когда ничего не помогает, прочтите руководство! Или заметки о выпуске. Я не ужасно удивлен тем, что Apple хочет отвернуться от наследия Unix. Я расстроен. Если они будут осторожны, они могут прогнать меня. Спасибо за информацию; Я поэкспериментирую с этим позже (после нескольких часов уловки).
Джонатан Леффлер
16
После установки пакета ( open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgв командной строке) у меня /usr/includeснова, и мой GCC 8.2.0 снова работает. Спасибо за указатель; молодец, найдя его. Я предлагаю вам написать ответ, так как, вероятно, другие люди столкнутся с проблемой.
Джонатан Леффлер

Ответы:

264

TL; DR

Убедитесь, что вы загрузили последний пакет «Инструменты командной строки» и запустили его из терминала (командной строки):

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Некоторые сведения о Catalina см. В разделе « Не удается скомпилировать программу C на Mac» после обновления до Catalina 10.15 .


Извлечение полусвязного ответа из довольно обширных комментариев ...

преамбула

Очень часто xcode-select --installбыло правильное решение, но, похоже, на этот раз оно не помогло. Вы пытались запустить основной интерфейс Xcode GUI? Это может установить дополнительное программное обеспечение для вас и очистить. Я сделал это после установки Xcode 10.0, но неделю или больше назад, задолго до обновления до Mojave.

Я заметил, что если ваш GCC установлен /usr/local/bin, вы, вероятно, не используете GCC из XCode; это обычно устанавливается в /usr/bin.

Я тоже обновился до MacOS 10.14 Mojave и Xcode 10.0. Тем не менее, и система, /usr/bin/gccи система /usr/bin/clangработают на меня ( Apple LLVM version 10.0.0 (clang-1000.11.45.2) Target: x86_64-apple-darwin18.0.0на обоих). У меня проблема с тем, что мой домашний GCC 8.2.0 не находит заголовки /usr/include, что параллельно с вашей проблемой с /usr/local/bin/gccпоиском заголовков.

Я провел небольшое сравнение, и моя машина Mojave вообще не имеет его, но /usr/includeвсе же /usr/bin/clangумеет компилировать. Заголовок ( _stdio.hс начальным подчеркиванием) был в моем старом /usr/include; сейчас его нет (отсюда моя проблема с GCC 8.2.0). Я запустил xcode-select --installи сказал « xcode-select: note: install requested for command line developer tools», а затем запустил установщик графического интерфейса, который показал мне лицензию, на которую я согласился, и он загрузил и установил инструменты командной строки - или так утверждал.

Затем я запустил Xcode GUI (командное пространство, Xcode, return) и сказал, что нужно установить еще немного программного обеспечения, но все же нет /usr/include. Но я могу скомпилировать с /usr/bin/clangи /usr/bin/gcc- и -vвариант предполагает, что они используют

InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Рабочий раствор

Тогда Maxxx отметил :

Я нашел способ. Если мы используем Xcode 10, вы заметите, что если вы перейдете /usrв Finder, вы больше не увидите папку с именем include, поэтому терминал жалуется на отсутствие заголовочных файлов, которые содержатся внутри папка «include». В примечаниях к выпуску Xcode 10.0 говорится, что есть пакет:

/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg 

и вы должны установить этот пакет, чтобы установить /usr/includeпапку. Тогда тебе должно быть хорошо идти.

Если ничего не помогает, прочтите руководство или, в этом случае, примечания к выпуску. Я не ужасно удивлен тем, что Apple хочет отвернуться от своего наследия Unix, но я разочарован. Если они будут осторожны, они могут прогнать меня. Спасибо за информацию.

Установив пакет с помощью следующей команды в командной строке, я /usr/includeснова установил , и мой GCC 8.2.0 снова работает.

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Загрузка инструментов командной строки

Как отмечает Весал в ценном комментарии , вам нужно скачать пакет инструментов командной строки для Xcode 10.1 в Mojave 10.14, и вы можете сделать это из:

Вы должны войти в систему с Apple ID, чтобы получить возможность загрузки. Когда вы закончите загрузку, установите пакет инструментов командной строки. Затем установите заголовки, как описано в разделе «Рабочее решение».

Это работало для меня на Мохаве 10.14.1. Должно быть, я скачал это раньше, но я уже забыл, когда отвечал на этот вопрос.

Обновление до Мохаве 10.14.4 и Xcode 10.2

Около 2019-05-17, я обновил до Mojave 10.14.4, и инструменты командной строки Xcode 10.2 также были обновлены (или инструменты командной строки Xcode 10.1 были обновлены до 10.2). openКоманда показано выше фиксированной недостающих заголовков. Могут все еще быть приключения с обновлением основного Xcode до 10.2 и затем переустановкой инструментов командной строки и пакета заголовков.

Обновление до Xcode 10.3 (для Мохаве 10.14.6)

В 2019-07-22 я получил уведомление через App Store, что доступно обновление до Xcode 10.3 и что оно включает SDK для iOS 12.4, tvOS 12.4, watchOS 5.3 и macOS Mojave 10.14.6. Я установил его на один из своих компьютеров 10.14.5, запустил его и установил дополнительные компоненты, как было предложено, и он, похоже, остался /usr/includeбез изменений.

Позже в тот же день я обнаружил, что MacOS Mojave 10.14.6 также был доступен (Системные настройки Update Обновление программного обеспечения) вместе с пакетом утилит командной строки IIRC (он был загружен и установлен автоматически). Установка обновления o / s снова уничтожила его /usr/include, но openкоманда в верхней части ответа снова восстановила его. Дата, которую я имел в файле для openкоманды, была 2019-07-15.

Обновление до XCode 11.0 (для Catalina 10.15)

Обновление до XCode 11.0 («включает в себя Swift 5.1 и SDK для iOS 13, tvOS 13, watchOS 6 и macOS Catalina 10.15») было выпущено 2019-09-21. Я был уведомлен о «доступных обновлениях», скачал и установил его на компьютеры с MacOS Mojave 10.14.6 через приложение App Store (вкладка «Обновления») без проблем и без необходимости работать /usr/include. Сразу после установки (перед запуском самого приложения) я попробовал перекомпиляцию и мне сказали:

Для получения лицензии Xcode / iOS требуются права администратора, пожалуйста, запустите «sudo xcodebuild -license», а затем повторите эту команду.

Запуск этого ( sudo xcodebuild -license) позволил мне запустить компилятор. С тех пор я запустил приложение для установки дополнительных компонентов, в которых оно нуждается; до сих пор нет проблем. Еще неизвестно, что произойдет, когда я обновлюсь до самой Catalina - но мои машины MacOS Mojave 10.14.6 в настоящее время исправны (2019-09-24).

Джонатан Леффлер
источник
4
Ах, спасибо, что написали это. Очень признателен. Ура!
Maxxx
6
Решил это для меня !!! Большое спасибо, что нашли время, чтобы написать это!
budekatude
8
Grump !!! С обновлением 10.14.1 все снова изменилось - или, по крайней мере, они снова изменились. Мне кажется, что обновление o / s сдуло/usr/include, и пакет, указанный в ответе выше, отсутствует,/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgиxcode-select --installговорит, что инструменты командной строки в настоящее время недоступны.
Джонатан Леффлер
15
Факинг Apple. Они не могут просто оставить вещи, которые работают, они должны двигать вещи, добавлять шаги и создавать отток.
7
В надежде, что поисковые системы найдут этот ответ, вышеприведенные инструкции решили проблему fatal error: bits/ctype_base.h: No such file or directory: #include <bits/ctype_base.h>при компиляции GCC 7.4.0 с использованием libstdc ++ для Mojave для меня
Адам Линдберг,
30

Перепробовав каждый ответ, который я смог найти здесь и в Интернете, я все еще получал ошибки для некоторых пропущенных заголовков. Когда я пытался скомпилировать pyRFR, я получал ошибки о stdexceptтом, что не найден, который, очевидно, не был установлен /usr/includeс другими заголовками. Тем не менее, я нашел, где он прячется в Мохаве, и добавил это в конец моего ~/.bash_profileфайла:

export CPATH=/Library/Developer/CommandLineTools/usr/include/c++/v1

Сделав это, я теперь могу скомпилировать pyRFR и другие программы на C / C ++. В соответствии с echo | gcc -E -Wp,-v -gcc искал в этих заголовках прежнее местоположение (без /c++/v1), но не новое, поэтому добавление этого в CFLAGS исправило это.

Найджел
источник
Ничего не сработало, но этот сработал. Большое спасибо!!
Феликс
2
wickedsickbrothnx
Дэвис Дулин
23

Когда ты

  • обновлено до Mojave 10.14.6
  • Ваш /usr/includeбыл удален снова
  • пакет, упомянутый в ответе @ Jonathan-lefflers, больше не существует The file /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg does not exist.и
  • Xcode жалуется, что инструменты командной строки уже установлены xcode-select --install xcode-select: error: command line tools are already installed, use "Software Update" to install updates

Затем, что помогло мне восстановить упомянутый пакет, было удаление всей CommandLineToolsпапки (sudo) rm -rf /Library/Developer/CommandLineToolsи ее переустановка xcode-select --install.

Plattenschieber
источник
Превосходно! После ваших шагов, macOS_SDK_headers_for_macOS_10.14.pkgполучить доступ, и команда open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgсделала то, что должен был сделать. Бесконечно благодарен!!
Бруно Амброзио
3
Для меня сработало следующее: export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include
rbieber
Спасибо! Я застрял, но это действительно помогло мне с Mojave 10.4.6 и XCode 11.3.1
Simeon G
Каждый раз, когда Apple выпускала обновление системы, я должен был решить эту проблему с Clion по-другому.
igonejack
12

Проблема в том, что Xcode, особенно Xcode 10.x, не установил все, поэтому убедитесь, что инструменты командной строки установлены, введите его в оболочке терминала:

xcode-select --install

также запустите Xcode и убедитесь, что установлена ​​вся необходимая установка (вы должны получить запрос, если это не так.) и поскольку Xcode 10 не устанавливает полный Mac OS SDK, запустите установщик по адресу

/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

поскольку этот пакет не установлен Xcode 10.

Джеймс Ринкевич
источник
1
Это спасло меня. Большое спасибо!
Демвен Вейр
7

Я нашел отличное решение и объяснение в этом комментарии GitHub . Хитрость:

make SDKROOT=`xcrun --show-sdk-path` MACOSX_DEPLOYMENT_TARGET=

Сделал работу.

обкрадывать
источник
5

ПРИМЕЧАНИЕ. Следующее, скорее всего, в значительной степени зависит от контекста и ограничено по времени до переключения / общей доступности Macos Catalina 10.15. Новый ноутбук. Я пишу это 1 октября 2019 года.

Я считаю, что именно эти конкретные обстоятельства и вызвали у меня проблемы со сборкой. Они могут не применяться в большинстве других случаев.

Контекст:

  • macos 10.14.6 Mojave, Xcode 11.0, прямо перед запуском macos Catalina 10.15 . Недавно приобретенный Macbook Pro.

  • сбой pip install psycopg2, который, по сути, является пакетом Python, компилируемым из исходного кода.

  • Я уже провел ряд предложенных корректировок в ответах, приведенных здесь.

Мои ошибки:

pip install psycopg2
Collecting psycopg2
  Using cached https://files.pythonhosted.org/packages/5c/1c/6997288da181277a0c29bc39a5f9143ff20b8c99f2a7d059cfb55163e165/psycopg2-2.8.3.tar.gz
Installing collected packages: psycopg2
  Running setup.py install for psycopg2 ... error
    ERROR: Command errored out with exit status 1:
     command: xxxx/venv/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/bk/_1cwm6dj3h1c0ptrhvr2v7dc0000gs/T/pip-install-z0qca56g/psycopg2/setup.py'"'"'; __file__='"'"'/private/var/folders/bk/_1cwm6dj3h1c0ptrhvr2v7dc0000gs/T/pip-install-z0qca56g/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/bk/_1cwm6dj3h1c0ptrhvr2v7dc0000gs/T/pip-record-ef126d8d/install-record.txt --single-version-externally-managed --compile --install-headers xxx/venv/include/site/python3.6/psycopg2


...
/usr/bin/clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -pipe -Os -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -DPSYCOPG_VERSION=2.8.3 (dt dec pq3 ext lo64) -DPG_VERSION_NUM=90615 -DHAVE_LO64=1 -I/Users/jluc/kds2/py2/venv/include -I/opt/local/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -I. -I/opt/local/include/postgresql96 -I/opt/local/include/postgresql96/server -c psycopg/psycopgmodule.c -o build/temp.macosx-10.14-x86_64-3.6/psycopg/psycopgmodule.o

    clang: warning: no such sysroot directory: 
'/Applications/Xcode.app/Contents/Developer/Platforms
                              ❌👇the real error👇❌
/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk' [-Wmissing-sysroot]
    In file included from psycopg/psycopgmodule.c:27:
    In file included from ./psycopg/psycopg.h:34:
    /opt/local/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m/Python.h:25:10: fatal error: 'stdio.h' file not found
                             ❌👆 what I thought was the error 👆❌
    #include <stdio.h>
             ^~~~~~~~~
    1 error generated.

    It appears you are missing some prerequisite to build the package 

Что я сделал до сих пор, ничего не исправляя

  • xcode-select --install
  • установлен XCode
  • open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Все та же ошибка на stdio.h.

который существует в нескольких местах:

(venv) jluc@bemyerp$ mdfind -name stdio.h
/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/stdio.h
/usr/include/_stdio.h
/usr/include/secure/_stdio.h
/usr/include/stdio.h   👈 I believe this is the one that's usually missing.
                            but I have it.
/usr/include/sys/stdio.h
/usr/include/xlocale/_stdio.h

Итак, давайте перейдем к тому первому каталогу, на clangкоторый жалуемся, и посмотрим:

(venv) jluc@gotchas$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
(venv) jluc@SDKs$ ls -l
total 0
drwxr-xr-x  8 root  wheel  256 Aug 29 23:47 MacOSX.sdk
drwxr-xr-x  4 root  wheel  128 Aug 29 23:47 DriverKit19.0.sdk
drwxr-xr-x  6 root  wheel  192 Sep 11 04:47 ..
lrwxr-xr-x  1 root  wheel   10 Oct  1 13:28 MacOSX10.15.sdk -> MacOSX.sdk  👈
drwxr-xr-x  5 root  wheel  160 Oct  1 13:34 .

Ха, у нас есть символическая ссылка для MacOSX10.15.sdk , но нет для MacOSX10.14.sdk . Вот моя первая clangошибка снова:

clang: warning: no such sysroot directory: '/Applications/Xcode.app/.../Developer/SDKs/MacOSX10.14.sdk' [-Wmissing-sysroot]

Я предполагаю, что Apple перепрыгнула через их конфигурацию xcode и уже думает, что они на Каталине. Так как это новый Mac, старая конфигурация для 10.14 не на месте.

ИСПРАВЛЕНИЕ:

Давайте символическую ссылку 10.14 так же, как 10.15:

ln -s MacOSX.sdk/ MacOSX10.14.sdk

Кстати, если я иду в этот каталог SDK, я нахожу:

...
./usr/include/sys/stdio.h
./usr/include/stdio.h
....

РЕЗУЛЬТАТ:

pip install psycopg2 работает.

Примечание: фактическая команда pip install не ссылалась на MacOSX10.14.sdk , который появился позже, возможно, из-за механизма установки Python, анализирующего версию ОС.

JL Peyret
источник
Что pipвы используете? Я думаю, что это может быть ключевой проблемой.
Франклин Ю
3

Не забудьте проверить Xcode Preferences -> Locations.

Инструменты командной строки, которые я выбрал, были для предыдущей версии Xcode (8.2.1 вместо 10.1)

bitbrane
источник
2

Были такие же проблемы, как ОП

вопрос

кот привет

#include <stdlib.h>
int main() { exit(0); }

лязг hello.c

/usr/local/include/stdint.h:2:10: error: #include nested too deeply
etc...

Попытка исправить

Я установил последнюю версию XCode, однако, в примечаниях к выпуску указывалось, что файл, упомянутый в предыдущем исправлении от Джонатана, больше не был доступен.

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Подробности здесь https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes , в разделе « Новые функции ».


Решение, которое сработало для меня ...

Используя детали в этом комментарии, https://github.com/SOHU-Co/kafka-node/issues/881#issuecomment-396197724

Я обнаружил, что brew doctorсообщил, что у меня есть неиспользованные включения в моей /usr/local/папке.

Чтобы исправить, я использовал команду, предоставленную пользователем HowCrazy , чтобы найти неиспользуемые включения и переместить их во временную папку.

Повторяется здесь ...

mkdir /tmp/includes
brew doctor 2>&1 | grep "/usr/local/include" | awk '{$1=$1;print}' | xargs -I _ mv _ /tmp/includes

После запуска сценариев проблема с включаемым файлом исчезла. nb: я прокомментировал эту проблему и здесь .

mlo55
источник
1

У меня была эта проблема, и ничего не получалось . Я побежал xcode-select --installи также установил /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg.

ЗАДНИЙ ПЛАН

Поскольку у меня были проблемы с App Store на новом ноутбуке, я был вынужден загрузить установщик Xcode Beta с веб-сайта Apple, чтобы установить Xcode вне App Store . Так что у меня была установлена только Xcode Beta .

РЕШЕНИЕ

Это, (я думаю), было сделано, clangчтобы не найти SDKROOTкаталог /Applications/Xcode.app/...., потому что Betaв пути его нет, или, возможно, Xcode Beta просто не устанавливает его (я не знаю). Чтобы решить эту проблему, мне пришлось удалить Xcode Beta и решить проблему App Store, чтобы установить версию выпуска.

tldr;

Если у вас есть бета-версия Xcode , попробуйте очистить все и установить выпускную версию, прежде чем испытывать решения, которые работают для других людей.

Серхио Пулгарин
источник
1

Я перепробовал почти все опубликованные решения, и у меня ничего не получалось. Я использую Mojave OS (10.14.6) и то, что в итоге сработало для меня (после удаления и переустановки Xcode и CLT и заголовков SDK):

  1. Установите Clang v8 с https://cran.r-project.org/bin/macosx/tools/.
  2. Измените следующие строки из файла ~ / .R / Makevars
CC=/usr/local/opt/llvm/bin/clang -fopenmp
CXX=/usr/local/opt/llvm/bin/clang++

с участием

CC=/usr/local/clang8/bin/clang -fopenmp
CXX=/usr/local/clang8/bin/clang++

Теперь пакеты R, использующие компиляторы C, успешно установлены.

Mak
источник
0

Как отмечает выше Джонатан Леффлер, файл macOS_SDK_headers.pkg больше не существует в Xcode 10.1.

Что мне помогло, так это то, brew upgradeчто обновления gcc и / или все, что делал homebrew за кулисами, решали проблемы пути.

Дэн
источник
0

apue.h зависимость все еще отсутствовала в моем /usr/local/includeпосле того, как мне удалось исправить эту проблему на Mac OS Catalina, следуя инструкциям этого ответа

Я скачал зависимость вручную из git и поместил ее в/usr/local/include

Мэтью Барбара
источник
0

У меня была такая же проблема с Golang (отладка с Goland) после миграции. Единственная (нелепая) вещь, которая помогла, это переименование следующей папки:

sudo mv /usr/local/include /usr/local/old_include

По-видимому, это связано со старыми файлами, которые homebrew установил и теперь сломал.

Владик Ю
источник
-1

@JL Пейрет прав!

если вы macos 10.14.6 Mojave, Xcode 11.0+

затем

cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs

sudo ln -s MacOSX.sdk / MacOSX10.14.sdk

user6821154
источник
Разве это не должно быть комментарием?
Франклин Ю