0
votes

/ usr / local / inclut inintéussitement ajouté à mes commandes de compile entraîne la construction d'échec

Contexte

Je compose, sur une machine qui dirige MacOS 10.15, un projet qui expédie une ancienne version de libpng (1.6.17) en tant que sous-module. Le code correspondant est disponible chez https://github.com/glennrp/libpng . J'ai aussi installé libpng 1.6.37 par homebrew. P>

Jusqu'à ce qu'il n'y a pas si longtemps, j'ai été capable de compiler libpng 1.6.17 en utilisant cmake sans problème. Depuis très récemment (mais la date exacte est inconnue de moi), la construction échoue avec des erreurs telles que: p> xxx pré>

J'ai couru quelques chèques contre une copie de mon projet que j'avais encore compilé correctement parce que Clake n'était pas renoncé à elle dessus. La seule différence entre les deux cas est un drapeau -I / USR / local / Inclure CODE> Ajouté aux appels de compilateur (j'ai ajouté du marquage pour aider à voir la différence): P>

  • Suite: XXX PRE> LI>
  • échoue: XXX PRE> LI> ul>

    Je re-ran cumake sur la copie du projet qui fonctionnait et j'ai eu la même erreur, qui m'a pointé sur un problème associé au système. J'ai ensuite vérifié directement les sources de libpng et j'ai obtenu la même erreur. P>

    étapes pour reproduire h1>
    1. clonez le repo de libpng et consultez V1.6.17 XXX PRE> LI>
    2. construire libpng XXX PRE> LI> ol>

      question h1>

      Qu'est-ce qui a ajouté ce -I / USR / local / Inclure code> drapeau sur mes appels de compilateur? em> p >

      Question bonus (peut-être plus intéressante) h1>

      Maintenant, ça devient drôle. Si vous cédez une libernisation plus récente (j'ai essayée avec 1.6.21, 1.6.25, 1.6.28, 1.6.33 et 1.6.37), le problème disparaît, bien que le drapeau soit toujours ici: P>

      /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc  -I/usr/local/include -I. -I../ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -MD -MT CMakeFiles/png16_static.dir/pngrio.o -MF CMakeFiles/png16_static.dir/pngrio.o.d -o CMakeFiles/png16_static.dir/pngrio.o   -c ../pngrio.c
      


0 commentaires

3 Réponses :


1
votes
  1. Réponse à la question: Le système inclut le chemin est ajouté par compilateur / préprocesseur ( Cette page expliquera plus de kindails)
  2. L'ordre de l'inclus dans le projet CMAKE peut être modifié (pas sûr de combien), la cmake permet à la préparation de la liste. Essayez de comparer les scripts de cumake Construire entre les versions. Je crois qu'il y aura mentionné le changement.

1 commentaires

En fait non: les scripts de Cumake Country n'ont pas changé, et c'est ce qui me confond. J'ai construit la bibliothèque avec succès sur d'autres machines avec une configuration apparemment similaire (j'ai également vérifié les appels de compilateur pour être sûr) et ne pas être exécuté dans cette erreur, il doit donc y avoir autre chose à définir ces indicateurs.



0
votes

Oui Parfois, la cmake prendra une variété de libs et comprendra des DIRS et un mélange librement et une correspondance. Si vous devez conserver plusieurs versions, vous devez utiliser la commande CUPAKE pour transmettre les packages appropriés.


0 commentaires

0
votes

Je suis finalement arrivé au bas de cela. Il s'est avéré que la dépendance de Zlib de libpng était celle qui me donne des ennuis (indirectement).

Qu'est-il arrivé

MacOS Ships Zlib et il est généralement connu des développeurs qui ne ressent donc pas la nécessité d'installer une ZLIB 3ème partie. Cependant, CMAKE'S FIND_PACKAGE ne connaît pas cette préférence et prendra une implémentation de ZLIB trouvée dans / USR / local , par exemple s'il est installé par Homewbrew. Pour une raison quelconque, une ZLIB a été installée par un logiciel tiers à cet endroit sur mon système, pas un package homebrew, qui a rendu la détection plus difficile, et il a été détecté par Find_Package . .

Le répertoire incluent correspondant est / usr / local / include . Le code CMAKE de LibPng est tel que ce répertoire est ensuite ajouté à la liste des répertoires d'inclure, ce qui entraîne les conflits d'en-tête mentionnés dans la question. J'ai compris ce qui se passait en passant par cmakecache.txt (recherche de / usr / local / include ), donc la leçon principale est la suivante: N'oubliez pas de Vérifiez votre cache de cmake dans de telles situations .

Comment résoudre le problème

la façon paresseuse . Supprimer les fichiers libèches indésirables. J'ai couru brew médecin et supprimé les fichiers qui n'étaient pas censés être ici. Ceci, cependant, pourrait avoir des conséquences indésirables si la version spécifique en zlib assis dans / usr / local est réellement requise par une pièce de logiciel.

la voie CUMAKE sale . Modifiez le code de cumake de niveau supérieur pour indiquer Find_Package < / a> sur l'endroit où il devrait choisir Zlib. Soit un code dur l'indice à l'aide de l'argument ou de la configuration à l'aide de l'argument zlib_root (vous pourriez avoir à définir des stratégies pour cela).

Je suis sûr qu'il y a une meilleure façon de gérer cela par "Faire du cmake Droit" en libpng et forçant la recherche de bibliothèque dans des chemins système, mais mes compétences de cmake ne sont pas assez bonnes pour dire ce qui devrait être fait exactement. Et de toute façon, c'est un peu hors sujet par rapport à la question.


0 commentaires