Неустранимая ошибка: файл EXTERN.h не найден при установке модулей Perl

При попытке установить модули Perl, такие как JSON::XS или YAML::XS, я получаю ту же ошибку:

XS.xs:1:10: фатальная ошибка: файл EXTERN.h не найден

Я использую MacBook, xCode обновлен, все остальное, что может помочь, тоже обновлено.


person Yehor Levchenko    schedule 06.10.2018    source источник
comment
Похоже, ваша установка Perl не завершена. Не хватает некоторых заголовков.   -  person melpomene    schedule 06.10.2018
comment
Я думаю, это может произойти, когда определенные библиотеки обновляются после установки Perl. Попробуйте переустановить Perl?   -  person Grinnz    schedule 07.10.2018
comment
Как сказал @melpomene, вам не хватает ключевых частей самого Perl. Многие дистрибутивы Linux по умолчанию устанавливают только части Perl и оставляют вам возможность установить оставшиеся части по мере необходимости с помощью своего менеджера пакетов (apt / yum). Это может быть то же самое для MacBook?   -  person ikegami    schedule 07.10.2018


Ответы (7)


Начиная с 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.

person Peter Scott    schedule 25.10.2018

После прочтения 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»

person maarten    schedule 22.03.2019
comment
Да, спасибо за ваш вклад. Моя проблема была решена после полного удаления и чистой, правильной переустановки. Кажется, я что-то напутал. - person Yehor Levchenko; 23.03.2019
comment
выполнение /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg исправило это для меня, даже если у меня уже были установлены Xcode10 и инструменты командной строки. Спасибо! - person godzillante; 10.07.2019

Чтобы следовать общему совету, я также попытался с помощью 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. Следующие шаги (путем определения отсутствующего файла в надежде на более общий подход к более или менее эквивалентным проблемам) сделали свое дело:

  1. Найдите файл заголовка (в данном случае 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
    
  2. Убедитесь, что установленная версия Perl (здесь 5.18) соответствует заголовочному файлу:

    perl -v | grep version 
    This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level
    
  3. Экспортируйте путь для 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
    
  4. Вызвать Makefile.PL с perl

    perl Makefile.PL
    
person HRitter    schedule 26.01.2020

Кстати, для тех, кто все еще борется с этим, мой обходной путь:

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"
person DabeDotCom    schedule 03.02.2021

Для 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.

person Archie    schedule 19.07.2021

Пожалуйста, попробуйте это

CPATH=$(dirname $(find /usr/local/Cellar/ -name EXTERN.h)) cpan JSON::XS
person E Lisse    schedule 24.05.2021

Никаких обещаний, но yum install perl-devel у меня сработало.

person Ben Aveling    schedule 18.06.2021