Após atualizar para o Catalina a partir do Mojave, Configurando: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk no env.
Não consigo compilar um programa que use o <cmath>
cabeçalho.
Tentei alterar CFLAGS, CCFLAGS, CXXFLAGS para apontar para o local do MacOSSDK que não muda nada
Scanning dependencies of target OgreMain
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f OgreMain/CMakeFiles/OgreMain.dir/build.make OgreMain/CMakeFiles/OgreMain.dir/build
[ 0%] Building CXX object OgreMain/CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o
cd /Users/roman/Downloads/ogre-1.12.2/build/OgreMain && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -DOgreMain_EXPORTS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OSX -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include/Threading -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/src -I/Users/roman/Downloads/ogre-1.12.2/build/Dependencies/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain/include -I/Users/roman/Downloads/ogre-1.12.2/build/include -I/Users/roman/Downloads/ogre-1.12.2/OgreMain -isystem /usr/local/include -Wall -Winit-self -Wcast-qual -Wwrite-strings -Wextra -Wundef -Wmissing-declarations -Wno-unused-parameter -Wshadow -Wno-missing-field-initializers -Wno-long-long -Wno-inconsistent-missing-override -msse -O3 -DNDEBUG -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -std=c++11 -o CMakeFiles/OgreMain.dir/src/OgreASTCCodec.cpp.o -c /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreASTCCodec.cpp:29:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/src/OgreStableHeaders.h:40:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgrePrerequisites.h:309:
In file included from /Users/roman/Downloads/ogre-1.12.2/OgreMain/include/OgreStdHeaders.h:10:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:314:9: error: no member named 'signbit' in the global namespace
using ::signbit;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:315:9: error: no member named 'fpclassify' in the global namespace
using ::fpclassify;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:316:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
por exemplo, a macro: isless
está presente no espaço para nome global e no meu computador:
➜ cat math.h | grep "isless"
#define isless(x, y) __builtin_isless((x),(y))
#define islessequal(x, y) __builtin_islessequal((x),(y))
#define islessgreater(x, y) __builtin_islessgreater((x),(y))
➜ pwd
/usr/local/include
➜
Até o cabeçalho cmath o inclui:
➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>
E minha linha de comando tem a opção -isystem /usr/local/include
Isso deve funcionar ...
xcode-select -p
onde o Xcode está localizado? Você pode alterar o código parausing std::signbit;
, da mesma forma para os outros? Você está compilando como C ++ 11 ou posterior?xcode-select -p
corresponde a ondeXCode
está localizado.using ::signbit;
e o símbolo não está no espaço para nome global, está nostd::
espaço para nome. Presumo o mesmo com os outros (não os persegui).Respostas:
Estou curioso: Qual compilador você está usando? Qual é o valor de
CMAKE_OSX_SYSROOT
?Estou bastante convencido de que isso é resultado de um erro
CMAKE_OSX_SYSROOT
. Eu tive o problema que você está descrevendo ao usar ligações python para clang (onde o CMake não gerencia a chamada do compilador), mas consegui recriar o erro no CMake fazendo:Resolvi meu problema seguindo as respostas a esta pergunta: Não é possível compilar pacotes R com código c ++ após a atualização para o macOS Catalina .
Para resumir: Na Catalina,
/usr/include
é eliminado e protegido pelo SIP. Portanto, qualquer projeto que espere que os cabeçalhos C sejam encontrados lá falhará na compilação. Se bem me lembro, a Apple recomenda a relatórios de bugs arquivos para projetos que esperam os cabeçalhos C no/usr/include
.Você deve apontar o sistema de compilação do código que está tentando compilar para os cabeçalhos corretos:
(1) Verifique se o Xcode está atualizado. Não há como dizer o que um Xcode desatualizado na Catalina pode fazer com o seu ambiente de construção.
(2) Use o
-isysroot /sdk/path
sinalizador do compilador, onde/sdk/path
é o resultado dexcrun --show-sdk-path
. Não sei ao certo qual é a melhor prática do CMake, mas tente fazerou
Se isso resolver o problema, você pode procurar uma maneira melhor de fazer isso no CMake.
Obviamente, se você é aventureiro, também pode desativar o SIP, conforme sugerido na resposta à minha pergunta: / usr / include ausente no macOS Catalina (com Xcode 11)
fonte
set(CMAKE_OSX_SYSROOT ...)
entraCMakeLists.txt
, não a concha.Estou tendo o mesmo problema ao tentar segmentar o iOS (no meu MacBook Air e no corredor GitHub Actions) e aqui estão mais algumas reflexões sobre o problema, embora eu não esteja familiarizado o suficiente com o ecossistema da Apple para sugerir uma solução adequada. A linha de comando original vinha do CMake no cpprestsdk, mas depois que eu a reduzi ao essencial, aqui está uma breve reprodução.
cmath-bug.cpp
com a única linha:Quando o executo, familiarizo-me com muitos que enfrentam o mesmo problema:
Os únicos 2 diretórios de inclusão que passo na minha linha de comando original existem e são:
Mas as partes interessantes aqui são os diretórios de inclusão inexistentes que ele relata, bem como os diretórios de inclusão que ele acaba pesquisando eventualmente e sua ordem. Meu palpite é que diretórios adicionais não mencionados na linha de comando são inseridos pelo driver do Apple Clang com base em alguma lógica específica da Apple.
Você pode ver pelo erro relatado que o
<cmath>
cabeçalho está localizado em:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
e na linha 304 dele, você pode ver:A julgar pelo fato de que nessa mesma pasta
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
existe um arquivomath.h
que fornece as definições necessárias, por exemplo:os autores
<cmath>
esperavam que amath.h
partir dessa mesma pasta fosse incluída primeiro e, em seguida, a#include_next <math.h>
diretiva encontrasse o sistema específicomath.h
. Isso não é o que está acontecendo na realidade, no entanto.Se você observar as 2 primeiras entradas nos diretórios pesquisados:
você vê que o diretório de inclusão específico do sistema acaba acima do diretório da biblioteca padrão injetado por Clang, e é por isso que o específico do sistema
math.h
está sendo encontrado, não aquele na mesma pasta que o restante dos cabeçalhos da biblioteca padrão. Provavelmente, esse é o caso, porque se eu adicionar explicitamente o diretório include da biblioteca padrão à minha linha de comando ANTES dos outros dois diretórios,-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
o problema desaparecerá e eu posso compilar o arquivo. Não é isso que o driver de Clang ou o que mais está envolvido aqui faz automaticamente: ele adiciona esse diretório de biblioteca padrão via-internal-system
(não sabe qual é a semântica desse sinalizador interno) e o adiciona APÓS o diretório do sistema.Agora, se você olhar para a lista de diretórios ignorados, a primeira entrada nessa lista é:
dos quais a
c++/v1
parte final não existe na minha máquina, me perguntando se a instalação do iPhone SDK deveria criar um link simbólicoc++
dentro da parte existente do caminho para apontar para o/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
diretório e fazer com que tudo funcionasse.Enfim, é isso que eu acho que está acontecendo e me pergunto se alguém sabe como consertar isso corretamente.
Obrigado!
PS Para o contexto:
fonte
Usando o comando:
minha #include <...> sequência de pesquisa:
O motivo do erro #include está descrito abaixo:
O conserto:
Eu segui a opção nº 2 e a compilação foi bem-sucedida agora!
E obrigado a Solodon pela resposta detalhada. Eu segui a resposta para corrigir o problema.
fonte
É possível que sua cópia do Xcode esteja corrompida. Verifique com o código de código:
Isso aconteceu comigo e o problema foi corrompido no Xcode. A reinstalação corrigiu.
Algo havia modificado o seguinte:
math.h
estava vazio em todos os lugares acima.fonte
A análise do @ solodon está no local. É provável que o problema
cmath
esteja incluindo a versão errada, commath.h
base na ordem de pesquisa dos arquivos de cabeçalho. Pelo menos, é o que estava acontecendo comigo quando estava recebendo o mesmo erro.Examine a saída do seu compilador
#include <...> search starts here:
. Você também pode forçar essa saída na linha de comando com (fonte) :Deve ser algo como isto:
Observe que os caminhos com
Toolchains
vêm antes daqueles comPlatforms
. Se, no seu caso, a ordem for revertida, você precisará descobrir o que está causando isso na sua configuração. Para mim, era uma configuração explícitaCPLUS_INCLUDE_PATH
no meu script de login.Código incorreto:
Isso foi parte da minha tentativa de solucionar o Xcode 11, não fornecendo mais o pacote de instalação para os arquivos de cabeçalho do SDK. Depois de remover esse código, consegui incluir com êxito
cmath
no meu código C ++.Se você veio aqui procurando soluções para esse problema, pode precisar de uma solução diferente, mas espero que isso ajude a esclarecer o que parece ser a causa raiz desse problema, ordem do caminho de pesquisa do arquivo de cabeçalho.
fonte
Eu descobri que dentro do meu projeto eu tenho arquivo
math.h
. Depois de renomeá-lo, o problema desapareceu. Costurascmath
incluem meu arquivo em vez de sistema.fonte
Acabei de receber esse erro ao tentar compilar o gRPC após atualizar recentemente para 10.15.4 e Xcode 11.4 e comecei a examinar todas as soluções oferecidas (aqui e Não é possível compilar um programa C em um Mac após atualizar para o Catalina 10.15 ) , e tentei alguns deles (apesar de não tentar recriar,
/usr/include
pois isso violaria a separação que a Apple estava tentando criar) - nada parecia funcionar.Em seguida, observei atentamente as invocações complier reais que o
make
processo estava produzindo e notei que havia umque estava causando a inclusão incorreta da ordem - remover esse caminho de inclusão explícito permitiu que a compilação fosse bem-sucedida com uma instalação padrão das ferramentas de linha de comando catalina, Xcode e Xcode, como seria de esperar, sem outros sinalizadores de truques / compiladores necessário.
fonte
pkg-config
arquivos (por exemplo, libcurl) do Homebrew adicionam esse caminho automaticamente, mesmo se você tiver o Xcode instalado. Isso foi corrigido no Homebrew 2.2.13. Mais detalhes em github.com/Homebrew/brew/issues/5068 ; O PR que corrige isso está no github.com/Homebrew/brew/pull/7331 . TL; DR: atualização homebrewVocê pode tentar usar o CommandLineTools SDK em vez do XCode.app SDK.
Corrijo esse problema ao compilar o PointCloudLibrary (PCL)
Além disso, reinstale o XCode.app e o CommandLineTools pode ajudar.
fonte
Resumo: no meu caso, o script de construção estava usando uma versão mais antiga do
ios-cmake
toolchain (2.1.2) e atualizá-lo para 3.1.2 corrigiu o problema cmath / math include.Adaptação do comando nifty proposto por @Ryan H.
gcc -Wp,-v -E -
para o meu caso (clang, c ++, destino iOs)produz dois Catalina, incluindo um virgem, onde apenas a ferramenta já instalada é o XCode 11.14.1:
Portanto, o caminho de inclusão correto é o primeiro não ignorado; tudo deve funcionar bem, mas não funcionou. Parece que o problema veio de um comando de inclusão adicional anexado à chamada de compilação pela cadeia de ferramentas ios-cmake:
O culpado foi a
-Isystem ...
linha, o que fará com que a#include <math>
linha no arquivo cmath acabe carregando o arquivo errado. Depois de muito tempo tentando consertar os scripts cmake, notei a versão mais antiga do ios-cmake, e atualizá-la teve o 'único' efeito de remover a-Isystem
linha indesejada - todo o resto era quase o mesmo (exceto algumas opções do compilador)fonte