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

Yeh*_*nko 8 perl json cpan

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

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

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

请发送帮助。

Pet*_*ott 11

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

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

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

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

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

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

最后,为了简化软件包/模块的安装,我建议您做一个brew install cpanminus。如果您以前已经安装过此软件,则可以通过执行以下操作来确保配置了路径等brew reinstall cpanminus

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

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

我还遇到了Perl博客文章,该文章提出了针对Mojave上的perlbrew的XS问题的修复程序

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

我也在PerlMonks上将其作为新问题提出来


小智 5

阅读https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes#3035624并从/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg安装其他头文件之后

我成功编译,没有丢失的“ EXTERN.h”错误


HRi*_*ter 5

为了遵循通用建议,我还尝试使用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 #####
Run Code Online (Sandbox Code Playgroud)

因此,我决定按以下方式安装它(并且由于错误而没有遵循建议)。

即使在 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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用 perl 调用 Makefile.PL

    perl Makefile.PL
    
    Run Code Online (Sandbox Code Playgroud)