Há uma pergunta anterior Não é possível compilar o programa C em um Mac após a atualização para o Mojave , e as respostas para isso cobriram a maioria das variações do que está errado.
Agora - a partir de segunda-feira 2019-10-07 - você pode atualizar para o macOS Catalina 10.15. Mais uma vez, durante a atualização, o /usr/include
diretório foi deslumbrado com a atualização, mesmo que o XCode 11.0 tenha sido instalado antes da atualização (do Mojave 10.14.6) para a Catalina. Consequentemente, os compiladores criados para esperar que exista um /usr/include
diretório não funcionam mais.
A principal etapa recomendada para os problemas do Mojave - usando o comando:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
não funciona fora do portão porque o diretório /Library/Developer/CommandLineTools/Packages/
não existe (portanto, ainda não há um .pkg
arquivo para abrir).
Existe uma maneira (oficial) boa de criar e preencher o diretório /usr/include
?
/usr/include
usar as ferramentas de desenvolvedor da Apple com o Xcode atual da Apple. Os cabeçalhos e tais estão emXcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK
. (É necessário manter cabeçalhos em diretórios diferentes para oferecer suporte a várias plataformas de destino, e é bom não/usr/include
garantir que nenhuma compilação use acidentalmente arquivos dele ao direcionar uma versão diferente do sistema host.) O quexcode-select -p
mostra o caminho para o diretório ativo do desenvolvedor?/usr/include
-lo nos cabeçalhos do sistema. Eu gostaria de poder usá-lo ainda, embora eu suspeite que a Apple finalmente jogou fora os últimos vestígios de compatibilidade com os sistemas Unix herdados (até certo ponto, a escrita estava na parede com o sistema necessário para fazer o Mojave funcionar '). Nesse caso, eu provavelmente tenho que reconstruir o GCC especificando a localização atual dos cabeçalhos do sistema de alguma forma - bashing manual para saber como configurar o GCC.Respostas:
Para mim, adicione o seguinte caminho para
CPATH
resolver o problema:fonte
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
#include <stdlib.h>
e depois falhou ao compilar as reclamações: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);
- No entanto, quando adiciono#include <ctype.h>
antes#include <stdlib.h>
, ele compila OK. Ainda resolvendo o que isso significa e como lidar com isso automaticamente.Antes de prosseguir, instale as ferramentas de linha de comando do xcode.
Na verdade, você pode fazer isso! Na verdade, todos os cabeçalhos C são encontrados aqui nesta pasta:
Só precisamos criar um link simbólico para todos os arquivos de cabeçalho nesta pasta:
Funcionou para mim! a seguinte linha de comando cuidará de todos os problemas:
Você receberá algum aviso. Alguns dos cabeçalhos já existem, assim:
totalmente ok para ignorar. Isso é tudo.
fonte
/usr/local/
hierarquia de diretórios é destinada ao software local e não ao software do sistema. Na IMO, os cabeçalhos devem estar presentes/usr/include
e a Apple está apenas sofrendo./
no modo de gravação. Em seguida, preencha a/usr/include
pasta. É porque na 10.15, o sistema é montado como modo somente leitura. sem desativar o SIP, você não poderá montar o volume do sistema.TL; DR
Parece que a Apple considera
/usr/include
algo como o dodô - está extinto - ou talvez seja como o papagaio de Monty Python .Usar o GCC fornecido pela Apple (na verdade, é Clang com qualquer outro nome, como mostra a informação da versão) ou Clang evita problemas. Ambos
/usr/bin/gcc
e/usr/bin/clang
encontrarão as bibliotecas do sistema quatro níveis de diretório abaixo:Se você criar seu próprio GCC ou outro compilador, (provavelmente) precisará configurá-lo para encontrar as bibliotecas do sistema no diretório do aplicativo Xcode.
Explorações
Imediatamente após a atualização, executei o XCode 11.0. Ele queria instalar alguns componentes extras, então eu deixei. No entanto, isso não restabeleceu
/usr/include
ou o diretório em/Library
.Um dos outros conselhos da pergunta anterior era executar:
Ao fazer isso, alegou que baixou os utilitários de linha de comando e garantiu que
/usr/bin/gcc
e/usr/bin/clang
etc estavam presentes. Essa é uma etapa útil (embora eu não tenha verificado definitivamente se eles estavam presentes antes).Usando
/usr/bin/gcc
, agora é possível compilar programas:No entanto,
/usr/include
ainda está faltando. Há um diretório/Library
agora:Nem o diretório
System
nem oLibrary
diretório contêm algo muito promissor.Quando tudo mais falhar, leia o manual
Próxima etapa - encontre e leia as notas de versão:
Não há informações lá relacionadas a isso. Portanto, a probabilidade é (AFAICS, depois de apenas uma ou duas horas de esforço) que a Apple não suporta mais
/usr/include
- embora ainda tenha um totalmente carregado/usr/lib
(/lib
embora).Hora de verificar outra compilação com a opção GCC
-v
adicionada (no makefile que usei, a configuraçãoUFLAGS
adiciona a opção à linha de comando do compilador C):As informações principais nessa nevasca de dados são:
Esse é efetivamente o diretório 'raiz' da compilação, portanto, deve haver subdiretórios nesse
usr
e parausr/include
:Isso mostra que o nome do diretório de uma milha e totalmente memorável contém os cabeçalhos C e POSIX padrão, além de extras específicos da Apple.
O
/usr/local/
diretório anterior parece estar intacto; o aviso deusr/local/include
não existir no âmbito-isysrootdir
é inofensivo (e não é visível sem a-v
opção).fonte
wchar.h
não obtive erro. Tentei incluir esta pasta -I / Applications / Xcode.app / Contents / Developer / Platforms / MacOSX.platform / Developer / SDKs / MacOSX.sdk / usr / include e iam recebendo outros erros como sobre a falta de símbolos para "error: no member chamado 'isless' no espaço para nome global "--verbose
no arquivo de tarefas e percebeu que o código vs está olhando para a/usr/include/c++/v1/
pasta que não existe mais agora na catalina. Adicionada a seguinte pasta, juntamente com o sdk include acima e agora funciona. "-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /",/usr/include
desaparecer? Sempre fazia parte implicitamente do caminho de inclusão do compilador, para que o usuário nunca precisasse saber sobre ele (além de quando você estava tentando descobrir onde algo foi declarado). Clang faz o mesmo com o caminho do SDK abaixo,Xcode.app
portanto o efeito líquido é o mesmo./usr/include
AWOL desaparecido é que, se você construiu seu próprio GCC a partir da fonte, provavelmente foi compilado para encontrar os cabeçalhos do sistema/usr/include
e, portanto, as compilações falham. Eu quero usar o último GCC, bem como Clang. Estou feliz em usar o Clang da Apple, mas não estou feliz em usar o Clang da Apple disfarçado de GCC - não é o mesmo que GCC. Ainda não elaborei uma receita para criar o GCC com os cabeçalhos do sistema realocados. (Acho que--with-native-system-header-dir="${XCODE_HDR}"
é parte da resposta, mas não é, no entanto, a resposta completa.)Defina as seguintes
Make
variáveis implícitas para apontar para o local onde os cabeçalhos estão agora localizados para as Ferramentas de Linha de Comando do Xcode (Xcode CLI):A
-isysroot
opção atualiza o local dos arquivos raiz longe do diretório raiz do sistema/
.Portanto, isso garante que os
/usr/*
arquivos comuns sejam encontrados em seu novo local.Ou seja, os arquivos em
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
agora são encontrados. Esses arquivos são:fonte
CFLAGS
é muito mais complexo que uma única opção - a-isysroot
opção precisaria ser 'além de' as outras configurações (muitas outras configurações). Pode haver um kernel de uma idéia aqui (passar a-isysroot
opção e o local sob/Library/Developer/…
), mas iria precisar de algum polimento antes de estar pronto para o horário nobre.export CFLAGS+=-isysroot ...
vez disso funcionará para esse caso de uso. Essa é a única solução que funcionou para mim (no Mojave (10.14) com o SDK da Catalina (10.15). Não tenho o.pkg
arquivo que todos falam, apesar de minhas ferramentas de linha de comando e XCode estarem atualizadas.CFLAGS=…
eCFLAGS+=…
.+=
. Obrigado @Norswap.SDKROOT
o mesmo valor sdk (/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
) também funcionará para mim!Eu sou um novato no compilador C ++ para R no OSX e tive o mesmo problema que o C ++ não conseguiu encontrar o cabeçalho após a atualização do SO ( falta math.h, embora estivesse lá ). Segui as instruções de https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/, mas nada mudou.
Finalmente, funcionou para mim depois que eu reinstalei a CLI do Xcode
e altere os sinalizadores para Var, conforme sugerido pela @Coatless:
fonte
No meu caso, eu parecia ter
llvm
egcc
também instalado usando homebrew. Quando os removi e, portanto, confiei totalmente no clang do macOS, ele pôde encontrar os cabeçalhos e a compilação funcionando novamente.fonte
dependência apue.h ainda estava faltando no meu
/usr/local/include
depois de seguir resposta Komol Nath Roy nesta pergunta.Eu baixei a dependência manualmente do git e a coloquei em
/usr/local/include
fonte
apue.h
vem de W Richard Stevens, Stephen A Rago Programação Avançada no Ambiente Unix, 3º Edn 2013. AFAIK, nunca foi fornecido pela Apple como cabeçalho do sistema. (Não está na/usr/include
minha máquina que ainda executa o Mojave.) Se ele já foi instalado/usr/include
, provavelmente foi criado manualmente, em vez de ser fornecido pela Apple. Como tal, ele deveria ter sido instalado/usr/local/include
anteriormente./usr/include
?/usr/include
" - use em seu/usr/local/include
lugar. Geralmente, é mais seguro para sair/usr/include
e/usr/lib
sozinho, e adicionar sob o material/usr/local
em seu lugar.A solução foi mais simples do que eu pensava. Instale clang / llvm.
Então precisamos criar links simbólicos.
E
Dependendo da sua versão do llvm, modifique os comandos acima.
Agora, você pode compilar programas C ++ sem passar nenhum sinalizador personalizado.
fonte
Eu tentei 1) ligar manualmente 2) brew install llvm, mas eles não funcionaram.
Finalmente, isso funcionou para mim: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
Configurando os seguintes env vars:
fonte
Para mim, funciona bem como segue:
fonte