web-dev-qa-db-ja.com

Perlモジュールのインストール中に「致命的エラー: 'EXTERN.h'ファイルが見つかりません」

JSON :: XSやYAML :: XSなどのPerlモジュールをインストールしようとすると、同じエラーが発生します。

XS.xs:1:10:致命的なエラー: 'EXTERN.h'ファイルが見つかりません

私はMacBookを使用していますが、xCodeは最新の状態です。

Plsは助けを送ります。

12
Yehor Levchenko

OS X El Capitan以降、Apple導入 System Integrity Protection )により、/ usr/lib/usr/binおよびその他の機密ディレクトリ(rootまたはSudoユーザーにさえも)への書き込みが制限されます)オペレーティングシステムにバンドルされているPerlのインストールで使用されます。これにより、新しいモジュールのインストールや、XSモジュール(外部Cライブラリにリンクされているモジュール)のインストール時に問題が発生する可能性があります。

このため、特にカスタムモジュールをインストールする場合は、デフォルトのPerlインストールを実際の開発環境と見なさないでください。

この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からこの種のアプローチに移行する場合に直面する可能性のある1つの問題は、Sudoを使用してインストールすることによる二日酔いに対処する必要があることです。これを正しく設定するには少し時間をかける価値がありますが、今後の問題は大幅に軽減され、すべてが壊れるのを恐れて何も変更したくないというしつこい気持ちに取り残されることはありません。 。

私も遭遇しました モハベのperlbrewでのXS問題の修正を示唆するPerlブログ記事

この Gist は、cpanシェルインストールルートの更新を説明していますが、上記の手順を実行した後、cpanが古い構成で動かなくなっていない限り、これは必要ありません。

PerlMonks の新しい問題としてこれも取り上げました

10
Peter Scott

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」エラーが発生せずにコンパイルに成功しました

4
user8807667

一般的なアドバイスに従うために、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 #####

そのため、次の方法でインストールすることにしました(エラーのため、アドバイスに従わないでください)。

上記の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コンパイラのパスをエクスポートします(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
HRitter