web-dev-qa-db-fra.com

"Erreur fatale: fichier 'EXTERN.h' introuvable" lors de l'installation des modules Perl

En essayant d'installer des modules Perl comme JSON :: XS ou YAML :: XS, je reçois la même erreur:

XS.xs: 1: 10: erreur fatale: fichier 'EXTERN.h' introuvable

J'utilise MacBook, xCode est à jour, tout ce qui pourrait aider est à jour aussi.

Veuillez envoyer de l'aide.

12
Yehor Levchenko

Depuis OS X El Capitan, Apple introduit System Integrity Protection qui restreint l'écriture dans/usr/lib/usr/bin et d'autres répertoires sensibles (même pour l'utilisateur root ou Sudo) ) qui sont utilisés par l'installation de Perl fourni avec le système d'exploitation. Cela peut entraîner des problèmes lors de l'installation de nouveaux modules et également lors de la tentative d'installation de modules XS (ceux liés aux bibliothèques C externes).

Pour cette raison, vous ne devez pas considérer l'installation Perl par défaut comme un environnement de développement fonctionnel, surtout si vous installez des modules personnalisés.

Découvrez ce fil sur PM et autres. J'avais depuis El-Capitan réussi à résoudre ce problème auparavant en construisant manuellement à partir de l'archive tar et en ajoutant quelques paramètres ou variables d'environnement pour définir les chemins en croyant qu'il serait préférable de conserver l'utilisation du système Perl, mais ce n'est pas la voie à suivre. Cela rend votre environnement difficile à construire, mais aussi fragile et sensible aux mises à jour du système d'exploitation qui peuvent soit casser les choses de différentes manières.

La meilleure pratique semble commencer par un Perl utilisant brew install Perl et travailler dans cet environnement, en pensant à configurer votre bash_profile comme indiqué par le programme d'installation.

N'oubliez pas non plus de faire un brew link Perl. Si vous recevez des avertissements à propos de cela qui ressemble à des bibliothèques Perl système, ne vous inquiétez pas - ce sont probablement des modules que vous avez installés par-dessus et cela vous évitera moins de problèmes de liaison. Si vous avez des préoccupations, notez les installations de module qui seront effacées et réinstallez-les une fois que votre environnement est configuré (c.-à-d. Que votre approche d'installation de module est configurée à l'aide de cpanm ou en respectant l'ancienne Perl -MCPAN -e Shell etc)

Cette nouvelle configuration Perl de brew élimine la nécessité de continuer à exécuter Sudo, ce qui ajoute une autre couche de choses qui peuvent mal tourner car les variables d'environnement ne suivent pas et des conflits d'autorisations surviennent, etc.

Enfin, pour simplifier l'installation du package/module, je suggère de faire un brew install cpanminus. Si vous l'aviez déjà installé, vous pouvez vous assurer que les chemins, etc. sont configurés en faisant un brew reinstall cpanminus

Si vous voulez aller plus loin, vous pouvez également installer perlbrew qui vous donnera la possibilité d'exécuter plusieurs versions de Perl en tant qu'utilisateur et de les configurer avec leurs propres bibliothèques et modules, ce qui peut être très utile, en particulier si vous vous alignez avec votre environnement de production pour les tests, etc.

Un problème que vous pouvez rencontrer si vous passez du système Perl à ce type d'approche est de devoir faire face à toute gueule de bois lors de l'installation de choses avec Sudo. Cela vaut la peine de prendre un peu de temps pour bien régler tout cela et vos problèmes à l'avenir seront considérablement réduits et vous ne serez pas laissé avec ce sentiment persistant que vous ne voulez rien changer de peur de tout casser .

J'ai également rencontré un Article de blog Perl qui suggère un correctif pour les problèmes XS avec perlbrew sur Mojave

Ceci Gist décrit la mise à jour de votre racine d'installation du shell cpan bien que cela ne soit pas nécessaire à moins que votre cpan ne soit bloqué dans une ancienne configuration après avoir suivi les étapes ci-dessus.

J'ai également soulevé cela comme un nouveau problème sur PerlMonks

10
Peter Scott

Après avoir lu https://developer.Apple.com/documentation/xcode_release_notes/xcode_10_release_notes#3035624 et installé les en-têtes supplémentaires à partir de /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.x

J'ai compilé avec succès sans l'erreur "EXTERN.h" manquante

4
user8807667

Afin de suivre les conseils courants, j'ai également essayé avec Perlbrew d'installer une version de développement dédiée de Perl. Surtout avec les conseils à l'esprit Tout d'abord, faites pas utilisez le système Perl sur MacOS. La version installée est pour Apple, pas pour vous (voir la discussion ici: https://www.perlmonks.org/?node_id=1224727 ).

Malheureusement, l'erreur suivante s'est produite:

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 #####

Par conséquent, j'ai décidé de l'installer de la manière suivante (et de ne pas suivre les conseils en raison de l'erreur).

Même après avoir installé les en-têtes macOS SDK mentionnés ci-dessus sur Catalina (macOS 10.15.2), cela n'a pas fonctionné pour moi. J'ai rencontré le problème lors de l'installation du module Perl Mac-SystemDirectory-0.13. Les étapes suivantes (en identifiant le fichier manquant dans l'espoir d'avoir une approche plus générique pour des problèmes plus ou moins équivalents) ont fait l'affaire:

  1. Localisez le fichier d'en-tête (dans ce cas 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. Assurez-vous que la version Perl installée (ici 5.18 ) correspond au fichier d'en-tête:

    Perl -v | grep version 
    This is Perl 5, version 18, Subversion 4 (v5.18.4) built for darwin-thread-multi-2level
    
  3. Exportez le chemin du C-Compiler (notez MacOSX10.15.sdk pour Catalina et Perl version 5.18)

    export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE
    
  4. Appelez le Makefile.PL avec Perl

    Perl Makefile.PL
    
2
HRitter