Catalina C ++: использование заголовков <cmath>приводит к ошибке: в глобальном пространстве имен нет члена с именем signbit - PullRequest
7 голосов
/ 30 октября 2019

После обновления до Каталины из Мохаве, Настройка: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk в env.

I 'Я не смог скомпилировать программу, использующую заголовок <cmath>.

Я попытался изменить CFLAGS, CCFLAGS, CXXFLAGS, чтобы они указывали на расположение MacOSSDK, которое ничего не меняет

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;

, например, макрос:isless присутствует в глобальном пространстве имен и на моем компьютере:

➜ 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
➜

Даже заголовок cmath включает его:

➜ cat /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath | grep "math.h"
#include <math.h>

И в моей командной строке есть опция -isystem /usr/local/include

Это должно работать ...

1 Ответ

1 голос
/ 02 ноября 2019

Мне интересно: какой компилятор вы используете? Каково значение CMAKE_OSX_SYSROOT?

Я вполне уверен, что это результат неправильного CMAKE_OSX_SYSROOT. У меня была проблема, которую вы описываете при использовании привязок Python для Clang (где CMake не управляет вызовом компилятора), но мне удалось воссоздать ошибку в CMake, выполнив:

set(CMAKE_OSX_SYSROOT "")  # Reset.

Я решилпроблема, следуя ответам на этот вопрос: Невозможно скомпилировать пакеты R с кодом c ++ после обновления до macOS Catalina .

Подводя итог: На Catalina /usr/include очищается и защищается SIP. Таким образом, любой проект, который ожидает, что там будут найдены заголовки C, не будет компилироваться. Если я правильно помню, Apple рекомендует подавать отчеты об ошибках в проекты, которые ожидают заголовки C в /usr/include.

Вы должны указать систему сборки кода, который вы пытаетесь скомпилировать, на правильные заголовки:

(1) Убедитесь, что Xcode обновлен. Невозможно сказать, что может сделать устаревший Xcode на Catalina с вашей средой сборки.

(2) Используйте флаг компилятора -isysroot /sdk/path, где /sdk/path - результат xcrun --show-sdk-path. Я не уверен, что лучше использовать CMake, но попробуйте сделать

set(CMAKE_OSX_SYSROOT /sdk/path)

или

set (CMAKE_CXX_FLAGS "[...] -isysroot /sdk/path")

Если это решит проблему, возможно, вы захотите найти лучший способ сделать этоэто в CMake.

Конечно, если вы любите приключения, вы также можете отключить SIP, как предложено в ответе на мой вопрос: / usr / include отсутствует в macOS Catalina (с Xcode 11)

...