При попытке установить модули Perl, такие как JSON::XS или YAML::XS, я получаю ту же ошибку:
XS.xs:1:10: фатальная ошибка: файл EXTERN.h не найден
Я использую MacBook, xCode обновлен, все остальное, что может помочь, тоже обновлено.
При попытке установить модули Perl, такие как JSON::XS или YAML::XS, я получаю ту же ошибку:
XS.xs:1:10: фатальная ошибка: файл EXTERN.h не найден
Я использую MacBook, xCode обновлен, все остальное, что может помочь, тоже обновлено.
Начиная с 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 в Мохаве
В этом Gist описано обновление корня установки оболочки 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»
Чтобы следовать общему совету, я также попытался с помощью 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"
Для 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.
Пожалуйста, попробуйте это
CPATH=$(dirname $(find /usr/local/Cellar/ -name EXTERN.h)) cpan JSON::XS
Никаких обещаний, но yum install perl-devel
у меня сработало.
apt
/yum
). Это может быть то же самое для MacBook? - person ikegami   schedule 07.10.2018