Il y a une question précédente Impossible de compiler le programme C sur un Mac après la mise à niveau vers Mojave , et les réponses à cela ont couvert la plupart des variations sur ce qui ne va pas.
Maintenant - à partir du lundi 2019-10-07 - vous pouvez mettre à niveau vers macOS Catalina 10.15. Encore une fois, lors de la mise à niveau, le /usr/include
répertoire a été effacé par la mise à jour, même si XCode 11.0 a été installé avant la mise à niveau (de Mojave 10.14.6) vers Catalina. Par conséquent, les compilateurs conçus pour s'attendre à ce qu'il existe un /usr/include
répertoire ne fonctionnent plus.
La principale étape recommandée pour les problèmes de Mojave - en utilisant la commande:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
ne fonctionne pas hors de la porte car le répertoire /Library/Developer/CommandLineTools/Packages/
n'existe pas (il n'y a donc pas encore de .pkg
fichier à ouvrir).
Existe-t-il un bon moyen (officiel) de créer et de remplir le répertoire /usr/include
?
/usr/include
d'utiliser les outils de développement d'Apple avec le Xcode actuel d'Apple. Les en-têtes et autres sont làXcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK
. (Garder les en- têtes dans des répertoires différents est nécessaire pour soutenir les plates - formes cibles multiples, et il est bon de ne pas avoir un/usr/include
pour vous assurer qu'aucun compiles utiliser accidentellement des fichiers à partir quand le ciblage d' un autre version du système hôte). Qu'est-cexcode-select -p
spectacle pour le chemin d'accès le répertoire de développeur actif?/usr/include
pour les en-têtes du système. J'aimerais pouvoir l'utiliser encore, même si je soupçonne qu'Apple a finalement jeté les derniers vestiges de compatibilité avec les systèmes Unix hérités (dans une certaine mesure, l'écriture était sur le mur avec le système requis pour faire fonctionner Mojave) '). Dans ce cas, je dois probablement reconstruire GCC en spécifiant l'emplacement actuel des en-têtes du système en quelque sorte - dénigrement manuel pour savoir comment configurer GCC.Réponses:
Pour moi, ajouter le chemin suivant pour
CPATH
résoudre le problème:la source
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
#include <stdlib.h>
et n'a pas réussi à compiler se plaindre de:In file included from …/usr/include/sys/wait.h:110, —— from …/usr/include/stdlib.h:66, —— from bm.c:27: —— …/usr/include/sys/resource.h:443:9: error: no previous prototype for ‘getiopolicy_np’ [-Werror=missing-prototypes] —— 443 | int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
—— Pourtant, quand j'ajoute#include <ctype.h>
avant#include <stdlib.h>
, il compile OK. Toujours en train de comprendre ce que cela signifie et comment le gérer automatiquement.Avant de continuer, assurez-vous d'installer les outils de ligne de commande xcode.
En fait, vous pouvez le faire! En fait, tous les en-têtes C se trouvent ici dans ce dossier:
Nous avons juste besoin de créer un lien symbolique pour tous les fichiers d'en-têtes dans ce dossier:
Ça a marché pour moi! la ligne de commande suivante s'occupera de tous les problèmes:
Vous recevrez un avertissement. Certains en-têtes existent déjà, comme ceci:
totalement ok d'ignorer. c'est tout.
la source
/usr/local/
hiérarchie des répertoires est destinée aux logiciels locaux plutôt qu'aux logiciels système. OMI, les en-têtes devraient être là/usr/include
et Apple est juste une douleur./
en mode d'écriture. Remplissez ensuite le/usr/include
dossier. C'est parce que dans 10.15, le système se monte en mode lecture seule. sans désactiver le SIP, vous ne pourrez pas monter le volume système.TL; DR
Il semble qu'Apple considère
/usr/include
comme quelque chose qui a suivi le chemin du dodo - il est éteint - ou peut-être que c'est comme le perroquet de Monty Python .L'utilisation du GCC fourni par Apple (en fait, c'est Clang sous un autre nom, comme le montrent les informations de version) ou Clang évite les problèmes. Les deux
/usr/bin/gcc
et/usr/bin/clang
trouveront les bibliothèques système quatre niveaux de répertoire ci-dessous:Si vous construisez votre propre GCC ou autre compilateur, vous devrez (probablement) le configurer pour trouver les bibliothèques système sous le répertoire d'application Xcode.
Explorations
Immédiatement après la mise à niveau, j'ai exécuté XCode 11.0. Il voulait installer des composants supplémentaires, alors je l'ai laissé faire. Cependant, cela n'a pas rétabli
/usr/include
ou le répertoire sous/Library
.L'un des autres conseils de la question précédente était de lancer:
Ce faisant, il a affirmé avoir téléchargé les utilitaires de ligne de commande, et il s'est assuré que
/usr/bin/gcc
et/usr/bin/clang
etc étaient présents. C'est une étape utile (même si je n'ai pas vérifié définitivement s'ils étaient présents auparavant).A l'aide
/usr/bin/gcc
, il est désormais possible de compiler des programmes:Cependant,
/usr/include
il manque toujours. Il y a un répertoire sous/Library
maintenant:Ni le répertoire
System
ni leLibrary
répertoire ne contiennent quelque chose de très prometteur.Lorsque tout le reste échoue, lisez le manuel
Étape suivante - recherchez et lisez les notes de version:
Il n'y a aucune information à ce sujet. Ainsi, la probabilité est (AFAICS, après seulement une heure ou deux d'efforts) qu'Apple ne prenne plus en charge
/usr/include
- bien qu'il ait toujours un système entièrement chargé/usr/lib
(non/lib
cependant).Il est temps de vérifier une autre compilation avec l'option GCC
-v
ajoutée (dans le makefile que j'ai utilisé, le paramètreUFLAGS
ajoute l'option à la ligne de commande du compilateur C):Les informations clés de ce blizzard de données sont les suivantes:
Il s'agit en fait du répertoire «racine» de la compilation, il devrait donc y avoir des sous-répertoires pour
usr
etusr/include
:Cela montre que le nom de répertoire long et totalement inoubliable contient les en-têtes C et POSIX standard, ainsi que des extras spécifiques à Apple.
Le
/usr/local/
répertoire précédent semble être intact; l'avertissement deusr/local/include
ne pas exister sous le-isysrootdir
est inoffensif (et n'est pas visible sans l'-v
option).la source
wchar.h
erreur introuvable. J'ai essayé d'inclure ce dossier -I / Applications / Xcode.app / Contents / Developer / Platforms / MacOSX.platform / Developer / SDKs / MacOSX.sdk / usr / include et iam obtenant d'autres erreurs comme à propos des symboles manquants pour "erreur: aucun membre nommé "isless" dans l'espace de noms global "--verbose
dans le fichier de tâches et remarqué que vs code recherche un/usr/include/c++/v1/
dossier qui n'existe plus maintenant en catalina. Ajout du dossier suivant ainsi que de l'inclusion sdk ci-dessus et maintenant cela fonctionne. "-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /",/usr/include
disparition? Il faisait toujours implicitement partie du chemin d'inclusion du compilateur, de sorte que l'utilisateur n'avait jamais besoin de le savoir (sauf lorsque vous essayiez de trouver où quelque chose a été déclaré). Clang fait de même avec son chemin de SDK sousXcode.app
donc l'effet net est le même./usr/include
AWOL disparu est que si vous avez construit votre propre GCC à partir de la source, il a probablement été compilé pour trouver les en-têtes du système/usr/include
et donc les compilations échouent. Je veux utiliser le dernier GCC ainsi que Clang. Je suis heureux d'utiliser Clang d'Apple, mais je ne suis pas heureux d'utiliser Clang d'Apple se faisant passer pour GCC - ce n'est pas la même chose que GCC. Je n'ai pas encore trouvé de recette pour construire GCC avec les en-têtes du système déplacés. (Je pense que cela--with-native-system-header-dir="${XCODE_HDR}"
fait partie de la réponse, mais ce n'est pas toute la réponse.)Définissez les
Make
variables implicites suivantes pour indiquer où se trouvent désormais les en-têtes pour les outils de ligne de commande Xcode (CLI Xcode):L'
-isysroot
option met à jour l'emplacement des fichiers racine loin du répertoire racine du système/
.Ainsi, cela garantit que les
/usr/*
fichiers communs se trouvent à leur nouvel emplacement.Autrement dit, les fichiers à
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
sont maintenant trouvés. Ces fichiers sont:la source
CFLAGS
est beaucoup plus complexe qu'une seule option - l'-isysroot
option devrait être «en plus» des autres paramètres (beaucoup d'autres paramètres). Il peut y avoir un noyau d'une idée ici (passez l'-isysroot
option et l'emplacement ci-dessous/Library/Developer/…
), mais il faudrait un peu de polissage avant qu'il ne soit prêt pour les heures de grande écoute.export CFLAGS+=-isysroot ...
place fonctionnera pour ce cas d'utilisation. C'est la seule solution qui a fonctionné pour moi (sur Mojave (10.14) avec Catalina (10.15) SDK. Je n'ai pas le.pkg
fichier dont tout le monde parle même si mes XCode et outils de ligne de commande sont à jour).CFLAGS=…
etCFLAGS+=…
.+=
. Merci @Norswap.SDKROOT
sur la même valeur sdk (/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
) fonctionnera également pour moi!Je suis un débutant avec le compilateur C ++ pour R dans OSX et j'ai eu le même problème que C ++ n'a pas pu trouver l'en-tête après la mise à jour du système d'exploitation ( math.h manquant bien qu'il soit là ). J'ai suivi les instructions de https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ mais rien n'a changé.
Enfin, cela a fonctionné pour moi après avoir réinstallé la CLI Xcode
puis changez les drapeaux en Var comme l'a suggéré @Coatless:
la source
Dans mon cas, j'ai semblé l'avoir installé
llvm
etgcc
aussi en utilisant homebrew. Lorsque j'ai supprimé ceux-ci, et que je me suis donc pleinement appuyé sur le macOS mac, il a pu trouver les en-têtes et la compilation fonctionnait à nouveau.la source
La dépendance apue.h manquait toujours dans mon
/usr/local/include
après avoir suivi la réponse de Komol Nath Roy dans cette question.J'ai téléchargé la dépendance manuellement depuis git et l'ai placée dans
/usr/local/include
la source
apue.h
provient de W Richard Stevens, Stephen A Rago Advanced Programming in the Unix Environment, 3rd Edn 2013. AFAIK, il n'a jamais été fourni par Apple comme en-tête du système. (Ce n'est pas/usr/include
sur ma machine qui exécute toujours Mojave.) S'il a été installé une fois/usr/include
, il a probablement été créé manuellement plutôt que fourni par Apple. En tant que tel, il aurait dû être installé/usr/local/include
précédemment./usr/include
?/usr/include
" - utilisez/usr/local/include
plutôt. En général, il est plus sûr de laisser/usr/include
et/usr/lib
seul, et ajouter de la matière en/usr/local
place.La solution était plus simple que je ne le pensais. Installez clang / llvm.
Ensuite, nous devons créer nous-mêmes des liens symboliques.
Et
Selon votre version llvm, modifiez les commandes ci-dessus.
Maintenant, vous pouvez compiler des programmes C ++ sans passer aucun indicateur personnalisé.
la source
J'ai essayé 1) de lier manuellement 2) brew install llvm, mais ils n'ont pas fonctionné.
Enfin, cela a fonctionné pour moi: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
En définissant les vars env suivants:
la source
Pour moi, cela fonctionne bien comme suit:
la source