При попытке установить модули Perl, такие как JSON :: XS или YAML :: XS, я получаю ту же ошибку:
XS.xs:1:10: fatal error: 'EXTERN.h' file not found
Я использую MacBook, xCode обновлен, все остальное, что может помочь, тоже обновлено.
Я думаю, это может произойти, когда некоторые библиотеки обновляются после установки Perl. Попробовать переустановить Perl?
Как сказал @melpomene, вам не хватает ключевых частей самого Perl. Многие дистрибутивы linux по умолчанию устанавливают Perl только по частям, и оставляют вам устанавливать оставшиеся биты по мере необходимости с помощью их диспетчера пакетов (apt / yum). Может быть то же самое и с MacBook?

Начиная с OS X El Capitan, Apple представила Защита целостности системы, который ограничивает запись в / usr / lib / usr / bin и другие важные каталоги (даже для пользователя root или sudo), которые используются при установке Perl в комплекте с операционной системой. Это может вызвать проблемы при установке новых модулей, а также при попытке установить модули XS (те, которые связаны с внешними библиотеками C).
По этой причине вам не следует рассматривать установку Perl по умолчанию как рабочую среду разработки, особенно если вы устанавливаете собственные модули.
Проверьте эта ветка в личку и другие. Мне удалось с тех пор, как El-Capitan удалось решить эту проблему, вручную создавая из tarball и добавляя несколько параметров или переменных среды для установки путей, полагая, что было бы лучше сохранить использование системного Perl, но это не путь. Это усложняет построение вашей среды, но также делает ее уязвимой и чувствительной к обновлениям ОС, которые могут нарушить работу различными способами.
Лучше всего начать с Perl, использующего brew install perl, и работать в этой среде, не забывая настроить свой bash_profile в соответствии с указаниями установщика.
Также стоит не забыть сделать brew link perl. Если вы получаете предупреждения об этом, что выглядит как системные библиотеки Perl, не волнуйтесь - это, скорее всего, модули, которые были установлены вами поверх, и у вас будет меньше проблем с их компоновкой. Если у вас есть сомнения, запишите, какие модули будут удалены, и переустановите их, как только ваша среда будет настроена (т. Е. Ваш подход к установщику модуля настроен с использованием cpanm или с использованием старого perl -MCPAN -e shell и т. д.)
Эта новая установка Perl от brew устраняет необходимость продолжать запуск sudo, что добавляет еще один уровень вещей, которые могут пойти не так, поскольку переменные среды не выполняются, возникают конфликты разрешений и т. д.
Наконец, чтобы упростить установку пакета / модуля, я предлагаю сделать brew install cpanminus. Если вы уже установили это ранее, вы можете убедиться, что пути и т. д. Настроены, выполнив brew reinstall cpanminus
Если вы хотите сделать еще один шаг вперед, вы также можете установить perlbrew, что даст вам возможность запускать несколько версий Perl от имени вашего пользователя и настраивать их с их собственными библиотеками и модулями, которые могут быть очень полезны, особенно если они согласованы с вашим производственная среда для тестирования и т. д.
Одна проблема, с которой вы можете столкнуться при переходе от системного Perl к такому подходу, заключается в том, чтобы справиться с любыми проблемами, связанными с установкой вещей с помощью sudo. Тем не менее, стоит потратить немного времени, чтобы все это настроить, и ваши проблемы в будущем будут значительно уменьшены, и вы не останетесь с тем мучительным чувством, что вы не хотите ничего менять из-за страха, что все это сломается. .
Еще мне попался Статья в блоге Perl, в которой предлагается решение проблем XS с perlbrew в Mojave
Этот Суть описывает обновление корневого каталога установки оболочки cpan, хотя в этом нет необходимости, если только ваш cpan не застрял в старой конфигурации после выполнения описанных выше действий.
Я также поднял это как новую проблему на PerlMonks
После прочтения https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes#3035624 и установки дополнительных заголовков через
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
Я успешно скомпилировал без ошибки "EXTERN.h"
Да, спасибо за ваш вклад. Моя проблема решилась после полного удаления и чистки, переустановки правильный. Похоже, я что-то напортачил.
выполнение / Library / Developer / CommandLineTools / Packages / macOS_SDK_heade rs_for_macOS_10.14.p kg исправило это для меня, даже если у меня уже были установлены Xcode10 и инструменты командной строки. Спасибо!
Чтобы следовать общему совету, я также попытался с помощью Perlbrew установить специальную версию Perl для разработки. Особенно с учетом совета Во-первых, нет использует системный Perl в MacOS. Установленная версия предназначена для Apple, а не для вас (см. Обсуждение здесь: https://www.perlmonks.org/?node_id=1224727).
К сожалению, произошла следующая ошибка:
Test Summary Report
-------------------
porting/libperl.t (Wstat: 65280 Tests: 35 Failed: 0)
Non-zero exit status: 255
Parse errors: No plan found in TAP output
Files=2653, Tests=1217766, 708 wallclock secs (52.74 usr 9.40 sys + 395.38 cusr 49.90 csys = 507.42 CPU)
Result: FAIL
make: *** [test_harness] Error 1
##### Brew Failed #####
Поэтому я решил установить его следующим образом (а не следуя совету из-за ошибки).
Даже после того, как вышеупомянутые заголовки macOS SDK уже были установлены на Catalina (macOS 10.15.2), у меня это не сработало. Я столкнулся с проблемой при установке модуля Perl Mac-SystemDirectory-0.13. Следующие шаги (путем определения отсутствующего файла в надежде найти более общий подход к более или менее эквивалентным проблемам) помогли:
Найдите файл заголовка (в данном случае EXTERN.h)
sudo find /Library -type f -name EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE/EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.28/darwin-thread-multi-2level/CORE/EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE/EXTERN.h
Убедитесь, что установленная версия Perl (здесь 5,18) соответствует заголовочному файлу:
perl -v | grep version
This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level
Экспортируйте путь для C-компилятора (обратите внимание на MacOSX10.15.sdk для Catalina и Perl версии 5.18)
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE
Вызов Makefile.PL с помощью perl
perl Makefile.PL
Кстати - для всех, кто все еще борется с этим, мой обходной путь был:
bash% module = "Sub::Util" # For example
bash% cpanm --configure-args = "INC=-I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE" "$module"
Пожалуйста, попробуйте это
CPATH=$(dirname $(find /usr/local/Cellar/ -name EXTERN.h)) cpan JSON::XS
Никаких обещаний, но yum install perl-devel у меня сработал.
Для Big Sur и perl 5.30 EXTERN.h находится по адресу /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE.
Я пытаюсь обновить сам CPAN и получаю эту ошибку. Но у меня есть / usr / bin / cpan, и я не могу писать туда, поэтому мне нужно настроить его, чтобы записать обновленную версию в / usr / local / bin / cpan.
Похоже, ваша установка Perl не завершена. Отсутствуют некоторые заголовки.