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

问题描述 投票:6回答:2

在尝试安装像JSON :: XS或YAML :: XS这样的Perl模块时,我收到同样的错误:

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

我使用MacBook,xCode是最新的,其他一切可以帮助的东西也是最新的。

请发送帮助。

json perl cpan
2个回答
9
投票

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

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

查看this thread on PM和其他人。我以前El-Capitan设法通过手动构建tarball并添加一些参数或环境变量来设置路径,认为最好保留使用Perl系统,但这不是可行的方法。这使得您的环境难以构建,但对操作系统更新也很脆弱且敏感,可能会以多种不同方式破坏事物。

最佳实践似乎是从使用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作为你的用户,并使用他们自己的libs和模块配置它们,这些非常有用,特别是在与你的对齐时测试等生产环境

如果从系统Perl迁移到这种方法,您可能遇到的一个问题是需要处理使用sudo安装内容时的任何遗留问题。值得花一点时间让所有这些设置正确,你的问题将会大大减少,你不会留下那种唠叨的感觉,你不想改变任何东西因为害怕它全部破坏。

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

这个Gist描述了更新你的cpan shell安装root,虽然这不应该是必要的,除非你的cpan在采取上述步骤后卡在旧的配置中。

我也提出这个问题作为PerlMonks的新问题


3
投票

阅读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'错误

© www.soinside.com 2019 - 2024. All rights reserved.