Después de actualizar a Catalina desde Mojave, Configuración: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk en el entorno.
No puedo compilar un programa que use <cmath>
encabezado.
Traté de cambiar CFLAGS, CCFLAGS, CXXFLAGS para señalar la ubicación MacOSSDK que no cambia 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 ejemplo, la macro: isless
está presente en el espacio de nombres global y en mi computadora:
➜ 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
➜
Incluso el encabezado cmath lo incluye:
➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>
Y mi línea de comando tiene la opción -isystem /usr/local/include
Esto debería funcionar...
xcode-select -p
Coincide donde se encuentra Xcode? ¿Puedes cambiar el código ausing std::signbit;
, también para los demás? ¿Estás compilando como C ++ 11 o posterior?xcode-select -p
coincide con el lugar dondeXCode
se encuentra.using ::signbit;
y el símbolo no está en el espacio de nombres global, está en elstd::
espacio de nombres. Presumo lo mismo con los demás (no los perseguí).Respuestas:
Tengo curiosidad: ¿Qué compilador estás usando? ¿Cuál es el valor de
CMAKE_OSX_SYSROOT
?Estoy bastante convencido de que esto es el resultado de un error
CMAKE_OSX_SYSROOT
. Tuve el problema que estás describiendo al usar enlaces de python para clang (donde CMake no administra la llamada del compilador), pero logré recrear el error en CMake haciendo:Resolví mi problema siguiendo las respuestas a esta pregunta: No puedo compilar paquetes R con código c ++ después de actualizar a macOS Catalina .
Para resumir: en Catalina,
/usr/include
se purga y protege mediante SIP. Por lo tanto, cualquier proyecto que espere que se encuentren los encabezados C allí no se compilará. Si no recuerdo mal, Apple recomienda a los informes de error de archivo a los proyectos que esperan cabeceras C en/usr/include
.Debe apuntar el sistema de compilación del código que está intentando compilar a los encabezados correctos:
(1) Asegúrese de que Xcode esté actualizado. No se sabe lo que un Xcode obsoleto en Catalina podría hacerle a su entorno de compilación.
(2) Utilice el
-isysroot /sdk/path
indicador del compilador, donde/sdk/path
es el resultado dexcrun --show-sdk-path
. No estoy seguro de cuál es la mejor práctica de CMake, pero intenta hacero
Si eso resuelve el problema, es posible que desee buscar una mejor manera de hacerlo en CMake.
Por supuesto, si eres aventurero, también puedes desactivar SIP, como se sugiere en la respuesta a mi pregunta: / usr / include missing en macOS Catalina (con Xcode 11)
fuente
set(CMAKE_OSX_SYSROOT ...)
entraCMakeLists.txt
, no la cáscara.Tengo el mismo problema al intentar apuntar a iOS (tanto en mi MacBook Air como en el corredor de acciones de GitHub) y aquí hay algunas ideas más sobre el problema, aunque no estoy lo suficientemente familiarizado con el ecosistema de Apple como para sugerir una solución adecuada. La línea de comando original provenía de CMake en cpprestsdk, pero una vez que la reduje a lo esencial, aquí hay una breve reproducción.
cmath-bug.cpp
con la única línea:Cuando lo ejecuto, me familiarizo con muchos que enfrentan el mismo problema:
Los únicos 2 directorios de inclusión que paso en mi línea de comando original existen y son:
Pero lo interesante aquí son los directorios de inclusión no existentes que informa, así como los directorios de inclusión que finalmente busca y su orden. Mi conjetura es que los directorios adicionales no mencionados en la línea de comando son insertados por el controlador de Apple Clang basado en alguna lógica específica de Apple.
Puede ver en el error informado que el
<cmath>
encabezado se encuentra en:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
y en la línea 304 puede ver:A juzgar por el hecho de que en esa misma carpeta
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
hay un archivomath.h
que proporciona las definiciones necesarias, por ejemplo:los autores
<cmath>
esperabanmath.h
que la misma carpeta se incluyera primero y luego la#include_next <math.h>
directiva encontrara el sistema específicomath.h
. Sin embargo, eso no es lo que sucede en realidad.Si observa las primeras 2 entradas en los directorios buscados:
verá que el directorio de inclusión específico del sistema termina por encima del directorio de la biblioteca estándar inyectado por Clang, por lo que se encuentra el específico del sistema
math.h
, no el que está en la misma carpeta que el resto de los encabezados de la biblioteca estándar. Este es probablemente el caso porque si agrego explícitamente el directorio de inclusión de la biblioteca estándar a mi línea de comando ANTES de los otros dos directorios,-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
el problema desaparece y puedo compilar el archivo. Eso no es lo que el controlador de Clang o cualquier otra cosa involucrada aquí hace automáticamente: agrega ese directorio de biblioteca estándar a través de-internal-system
(no estoy seguro de cuál es la semántica de ese indicador interno) y lo agrega DESPUÉS del directorio del sistema.Ahora, si mira la lista de directorios ignorados, la primera entrada en esa lista es:
de los cuales la
c++/v1
parte final no existe en mi máquina, lo que me hace preguntarme si se suponía que la instalación del SDK del iPhone crearía un enlace simbólicoc++
dentro de la parte existente de la ruta para apuntar al/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
directorio para que todo funcione.De todos modos, esto es lo que creo que está sucediendo y me pregunto si alguien sabe cómo solucionarlo correctamente.
¡Gracias!
PD Para el contexto:
fuente
Usando el comando:
mi #include <...> secuencia de búsqueda:
La razón del error #include se describe a continuación:
La solución:
¡He seguido la opción # 2 y la construcción es exitosa ahora!
Y gracias a solodon por la respuesta detallada. Seguí la respuesta para solucionar el problema.
fuente
Es posible que su copia de Xcode esté dañada. Consulte con codeign:
Esto me pasó a mí, y el problema fue Xcode corrupto. La reinstalación lo arregló.
Algo había modificado lo siguiente:
math.h
estaba vacío en todos los lugares anteriores.fuente
El análisis de @ solodon es perfecto. Es probable que el problema
cmath
incluya una versión incorrecta del archivomath.h
según el orden de búsqueda de los archivos de encabezado. Al menos, esto es lo que me estaba sucediendo cuando recibía el mismo error.Escanee la salida de su compilador para
#include <...> search starts here:
. También puede forzar esta salida desde la línea de comando con (fuente) :Debería verse más o menos así:
Note que los caminos con
Toolchains
vienen antes que aquellos conPlatforms
. Si en su caso el orden se invierte, debe averiguar qué está causando esto en su configuración. Para mí, fue una configuración explícitaCPLUS_INCLUDE_PATH
en mi script de inicio de sesión.Código ofensivo:
Esto fue parte de mi intento de evitar Xcode 11 que ya no proporciona el paquete de instalación para los archivos de encabezado del SDK. Después de eliminar este código, pude incluirlo con éxito
cmath
en mi código C ++.Si vino aquí buscando soluciones a este problema, es posible que necesite una solución diferente, pero con suerte esto ayudará a arrojar luz sobre lo que parece ser la causa raíz de este problema, el orden de la ruta de búsqueda del archivo de encabezado.
fuente
Encontré que dentro de mi proyecto tengo un archivo
math.h
. Después de cambiarle el nombre, el problema desapareció. Las costurascmath
incluyen mi archivo en lugar del sistema.fuente
Acabo de recibir este error al intentar compilar gRPC después de actualizar recientemente a 10.15.4 y Xcode 11.4 y comencé a buscar todas las soluciones ofrecidas (aquí y no puedo compilar un programa C en una Mac después de actualizar a Catalina 10.15 ) y probé algunos de ellos (aunque no intenté recrearlos,
/usr/include
ya que eso violaría la separación que Apple estaba tratando de crear), nada parecía funcionar.Luego miré de cerca las invocaciones reales de cumplimiento que el
make
proceso estaba produciendo y noté que había uneso finalmente causó que las inclusiones ocurrieran en el orden incorrecto: la eliminación de esta ruta de inclusión explícita permitió que la compilación tuviera éxito con una instalación predeterminada de catalina, Xcode y las herramientas de línea de comandos Xcode, como era de esperar, ningún otro truco / indicador de compilación necesario.
fuente
pkg-config
archivos (por ejemplo, libcurl) de Homebrew agregan esta ruta automáticamente, incluso si tiene instalado Xcode. Esto se solucionó en Homebrew 2.2.13. Más detalles en github.com/Homebrew/brew/issues/5068 ; PR que corrige esto está en github.com/Homebrew/brew/pull/7331 . TL; DR: Actualización homebrewPuede intentar usar el SDK de CommandLineTools en lugar del SDK XCode.app.
Arreglo este problema cuando compilo PointCloudLibrary (PCL)
Además, reinstalar XCode.app y CommandLineTools pueden ayudar.
fuente
Resumen: en mi caso, el script de compilación usaba una versión anterior de
ios-cmake
toolchain (2.1.2), y al actualizarlo a 3.1.2 se solucionó el problema de inclusión de cmath / math.Adaptando el ingenioso comando propuesto por @Ryan H.
gcc -Wp,-v -E -
para mi caso (clang, c ++, iOs target)rinde en dos Catalina, incluida una virgen donde la única herramienta instalada es XCode 11.14.1:
Entonces, la ruta de inclusión correcta es la primera no ignorada, todo debería funcionar bien, pero no fue así. Parece que el problema provino de un comando de inclusión adicional agregado a la llamada de compilación por la cadena de herramientas ios-cmake:
El culpable fue la
-Isystem ...
línea, lo que hará que la#include <math>
línea en el archivo cmath termine cargando el archivo incorrecto. Después de mucho tratar de arreglar los scripts de cmake, noté la versión anterior de ios-cmake, y actualizarlo tenía el 'único' efecto de eliminar la-Isystem
línea no deseada : todo lo demás era casi lo mismo (excepto algunas opciones de compilador)fuente