安装Perl模块时出现“致命错误:找不到'EXTERN.h'文件”

时间:2018-10-06 18:49:53

标签: json perl cpan

在尝试安装JSON :: XS或YAML :: XS之类的Perl模块时,我收到相同的错误:

  

XS.xs:1:10:致命错误:找不到“ EXTERN.h”文件

我使用的是MacBook,xCode是最新的,其他所有可以帮助的也是最新的。

请发送帮助。

7 个答案:

答案 0 :(得分:8)

自OS X El Capitan以来,Apple引入了System Integrity Protection,它限制了对/ usr / lib / usr / bin以及其他与Perl捆绑安装的安装所使用的敏感目录(甚至是root或sudo用户)的写入。操作系统。在安装新模块以及尝试安装XS模块(链接到外部C库的XS模块)时,这可能会导致问题。

因此,您不应将默认的Perl安装视为可以正常工作的开发环境,尤其是在安装自定义模块时。

签出this thread on PM和其他人。自从El-Capitan设法通过从tarball手动构建并添加一些参数或环境变量来设置路径来解决此问题以来,我认为最好保留使用Perl系统,但这不是走的路。这使您的环境难以构建,但又脆弱且对OS更新敏感,后者可能以多种不同方式破坏事物。

最佳实践似乎是从使用brew install perl的Perl开始并在此环境下工作,记住要按照安装程序的指示设置bash_profile。

还值得记住做一个brew link perl。如果您收到有关这种破坏的警告,那么看起来像系统Perl库的设备就不用担心-这些很可能是您在顶部安装的模块,通过它们进行链接的麻烦较少。如果您有疑问,请记下将清除哪些模块安装,并在配置了环境后重新安装它们(即,使用cpanm配置了模块安装程序的方法,或者坚持使用旧的perl -MCPAN -e shell等)

brew的这种新Perl设置消除了继续运行sudo的需要,这又增加了另一层可能会出错的事情,因为环境变量不会继续执行,并且权限冲突会发生。

最后,为简化软件包/模块的安装,我建议您进行brew install cpanminus。如果您以前已经安装过此软件,则可以通过执行brew reinstall cpanminus

来确保路径等已配置。

如果您想更进一步,那么您还可以安装perlbrew,这将使您能够以用户身份运行多个版本的Perl,并使用自己的库和模块来配置这些版本,这在某些情况下尤其有用。与生产环境保持一致以进行测试等。

如果从系统Perl转移到这种方法,您可能会遇到的一个问题是需要处理使用sudo安装东西带来的任何困扰。值得花一点时间来正确设置所有这些设置,并且您所遇到的问题将大大减少,并且您不会再有一种feeling琐的感觉,即您不想更改任何东西,因为担心一切都会破裂

我也遇到过Perl Blog Article that suggests a fix for XS issues with perlbrew on Mojave

Gist描述了更新cpan shell安装根目录的过程,尽管没有必要,除非执行上述步骤后cpan停留在旧配置中,否则这不是必需的。

我也在PerlMonks

上提出了新的问题

答案 1 :(得分:3)

为了遵循常见的建议,我还尝试与 Perlbrew 一起安装专用的Perl开发版本。尤其要记住首先,请不要在MacOS上使用系统Perl。已安装的版本适用于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 #####

因此,我决定按照以下方式安装它(由于错误,因此不遵循建议)。

即使已经在Catalina(macOS 10.15.2)上安装了上述macOS SDK头之后,它对我也不起作用。我在安装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编译器的路径(对于Catalina和Perl版本5.18,请注意MacOSX10.15.sdk)

    export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE
    
  4. 使用perl调用Makefile.PL

    perl Makefile.PL
    

答案 2 :(得分:2)

阅读enter image description here并从/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg安装其他标头

我成功编译,没有丢失'EXTERN.h'错误

答案 3 :(得分:2)

顺便说一句 - 对于仍在为此苦苦挣扎的任何人,我的解决方法是:

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"

答案 4 :(得分:1)

对于 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。

答案 5 :(得分:0)

请试试这个

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

答案 6 :(得分:0)

没有承诺,但 yum install perl-devel 对我有用。