Catalina C++: использование заголовков <cmath> приводит к ошибке: нет элемента с именем 'signbit' в глобальном пространстве имен
После обновления до Catalina из Mojave установка: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk в окружении.
Я не могу скомпилировать программу, использующую <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
Это должно сработать...
16 ответов
Мне любопытно: какой компилятор вы используете? Какая ценностьCMAKE_OSX_SYSROOT
?
Я совершенно уверен, что это результат неправильного CMAKE_OSX_SYSROOT
. У меня возникла проблема, которую вы описываете, при использовании привязок python для clang (где CMake не управляет вызовом компилятора), но мне удалось воссоздать ошибку в CMake, выполнив:
set(CMAKE_OSX_SYSROOT "") # Reset.
Я решил свою проблему, следуя ответам на этот вопрос: не удается скомпилировать пакеты R с кодом C++ после обновления до macOS 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)
Вы можете попробовать использовать CommandLineTools SDK вместо XCode.app SDK.
Я исправляю эту проблему при компиляции PointCloudLibrary (PCL)
#Check the current sdk
xcrun --show-sdk-path
#Change sdk
sudo xcode-select -s /Library/Developer/CommandLineTools #Using CommandLineTools SDK
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer #Using XCode.app SDK
Кроме того, переустановите XCode.app, и CommandLineTools может помочь.
У меня такая же проблема при попытке настроить таргетинг на iOS (как на моем MacBook Air, так и на GitHub Actions runner), и вот еще несколько мыслей по проблеме, хотя я недостаточно знаком с экосистемой Apple, чтобы предложить правильное решение. Исходная командная строка была взята из CMake в cpprestsdk, но как только я свел ее к основам, вот короткое воспроизведение.
- Создать файл
cmath-bug.cpp
с единственной строчкой в нем:
#include <cmath>
- Выполнить (новые строки перед некоторыми аргументами предназначены для удобства чтения, удалите их)
clang -v -x c++ -target arm64-apple-ios13.2 -fcolor-diagnostics -std=c++11 -stdlib=libc++
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
-isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
-c cmath-bug.cpp
Когда я запускаю его, я знаком со многими, сталкивающимися с одной и той же проблемой:
Apple clang version 11.0.0 (clang-1100.0.33.16)
Target: arm64-apple-ios13.2
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple arm64-apple-ios13.2.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name cmath-bug.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=13.2 -target-cpu cyclone -target-feature +fp-armv8 -target-feature +neon -target-feature +crypto -target-feature +zcm -target-feature +zcz -target-feature +sha2 -target-feature +aes -target-abi darwinpcs -fallow-half-arguments-and-returns -dwarf-column-info -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 530 -v -coverage-notes-file /Users/myuser/Projects/C++/cmath-bug.gcno -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk -isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include -stdlib=libc++ -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Users/myuser/Projects/C++ -ferror-limit 19 -fmessage-length 204 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=ios-13.2.0 -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o cmath-bug.o -x c++ cmath-bug.cpp
clang -cc1 version 11.0.0 (clang-1100.0.33.16) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include/c++/v1"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/Library/Frameworks"
ignoring duplicate directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/System/Library/Frameworks (framework directory)
End of search list.
In file included from cmath-bug.cpp:1:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:318: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:319: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:320:9: error: no member named 'isfinite' in the global namespace; did you mean 'finite'?
using ::isfinite;
~~^
Существуют только 2 подключаемых каталога, которые я передаю в исходной командной строке:
$ ls -alF /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
lrwxr-xr-x 1 root wheel 12B Dec 17 11:54 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk@ -> iPhoneOS.sdk
$ ls -alF /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
total 2160
drwxr-xr-x 169 root wheel 5.3K Dec 17 12:07 ./
drwxr-xr-x 5 root wheel 160B Nov 4 19:22 ../
...
-rw-r--r-- 9 root wheel 32K Nov 4 19:52 math.h
...
Но интересными здесь являются несуществующие каталоги include, о которых он сообщает, а также каталоги include, которые он в конечном итоге ищет, и их порядок. Я предполагаю, что дополнительные каталоги, не упомянутые в командной строке, вставляются драйвером Apple Clang на основе определенной логики Apple.
Из сообщения об ошибке видно, что <cmath>
заголовок находится по адресу: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
и в строке 304 вы можете увидеть:
#include <__config> // Line 304
#include <math.h> // This one ends up causing troubles
#include <__cxx_version>
Судя по тому, что в той же папке /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
есть файл math.h
который дает необходимые определения, например:
#include <__config>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif
#include_next <math.h>
#ifdef __cplusplus
// We support including .h headers inside 'extern "C"' contexts, so switch
// back to C++ linkage before including these C++ headers.
extern "C++" {
#include <type_traits>
#include <limits>
// signbit
#ifdef signbit
template <class _A1>
_LIBCPP_INLINE_VISIBILITY
bool
__libcpp_signbit(_A1 __lcpp_x) _NOEXCEPT
{
return signbit(__lcpp_x);
}
#undef signbit
template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
signbit(_A1 __lcpp_x) _NOEXCEPT
{
return __libcpp_signbit((typename std::__promote<_A1>::type)__lcpp_x);
}
...
#elif defined(_LIBCPP_MSVCRT)
...
#endif // signbit
авторы <cmath>
ожидали math.h
из той же папки, а затем #include_next <math.h>
директива найти системный math.h
. Однако на самом деле это не так.
Если вы посмотрите на первые 2 записи в искомых каталогах:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
вы видите, что системный каталог include оказывается над каталогом стандартной библиотеки, внедренной Clang, поэтому специфичный для системы math.h
находится не в той же папке, что и остальные заголовки стандартной библиотеки. Вероятно, это так, потому что, если я явно добавлю каталог стандартной библиотеки include в мою командную строку ПЕРЕД двумя другими каталогами-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
проблема исчезает, и я могу скомпилировать файл. Это не то, что драйвер Clang или что-то еще, что здесь задействовано, делает автоматически: он добавляет этот стандартный каталог библиотеки через-internal-system
(не уверен, какова семантика этого внутреннего флага), и он добавляет его ПОСЛЕ системного каталога.
Теперь, если вы посмотрите на список игнорируемых каталогов, самая первая запись в этом списке:
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk/usr/include/c++/v1"
из которых конечные c++/v1
часть не существует на моем компьютере, что заставляет меня задуматься, должна ли установка iPhone SDK создавать символическую ссылку c++
внутри существующей части пути, чтобы указать на /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
каталог, чтобы все это работало.
В любом случае, это то, что я думаю, происходит, и мне интересно, знает ли кто, как правильно это исправить?
Спасибо!
PS По контексту:
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
$ xcrun --show-sdk-path -sdk iphoneos13.2
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk
Используя команду:
gcc -Wp,-v -E -
моя последовательность поиска #include <...>:
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks (framework directory)
Причина ошибки #include описана ниже:
- #include<cmath> resides in /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
- It includes <math.h>.
- It searches /usr/local/include directory as this is the first directory to search. There is a math.h in "/usr/local/include/c++/9.3.0/" directory
- It tries to use this.
- But expectation was to use the math.h of the same directory /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
- The math.h of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 include math.h of /usr/local/include using #include_next<math.h>
- As wrong math.h is included/linked with /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath, the compilation error happens
Исправление:
1. If we can alter the search order of #include<...> to search /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 at first, it can be fixed.
2. Using #include</Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h> instead of <math.h> in /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
Я выбрал вариант №2, и теперь сборка прошла успешно!
И спасибо solodon за подробный ответ. Я последовал ответу, чтобы исправить проблему.
Возможно, ваша копия Xcode повреждена. Проверить с кодовым знаком:
codesign --verify /Applications/Xcode.app
Это случилось со мной, и проблема была в повреждении Xcode. Переустановка исправила это.
Что-то изменило следующее:
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/scanner.cpython-37.pyc
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/decoder.cpython-37.pyc
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/encoder.cpython-37.pyc
file added: /Applications/Xcode-11.3.1-.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/json/__pycache__/__init__.cpython-37.pyc
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/DriverKit19.0.sdk/System/DriverKit/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include/math.h
file modified: /Applications/Xcode-11.3.1-.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/math.h
math.h
было пусто во всех вышеперечисленных местах.
Я обнаружил, что внутри моего проекта есть файл math.h
. После переименования проблема исчезла. Швыcmath
включить мой файл вместо system.
Анализ @solodon удачен. Вероятно, проблема в том, чтоcmath
файл включает неправильную версию math.h
на основе порядка поиска файлов заголовков. По крайней мере, это то, что происходило со мной, когда я получал ту же ошибку.
Просканируйте вывод вашего компилятора на предмет #include <...> search starts here:
. Вы также можете заставить этот вывод из командной строки с помощью (источник):
gcc -Wp,-v -E -
Это должно выглядеть примерно так:
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
Обратите внимание, что пути с Toolchains
приходите раньше тех, у кого Platforms
. Если в вашем случае порядок обратный, вам нужно выяснить, что в вашей конфигурации вызывает это. Для меня это была явная установкаCPLUS_INCLUDE_PATH
в моем сценарии входа в систему.
Код нарушения:
XCBASE=`xcrun --show-sdk-path`
export CPLUS_INCLUDE_PATH=$XCBASE/usr/include
Это было частью моей попытки обойти Xcode 11, который больше не предоставляет установочный пакет для файлов заголовков SDK. После удаления этого кода я смог успешно включитьcmath
в моем коде C++.
Если вы пришли сюда в поисках решения этой проблемы, вам может потребоваться другое решение, но, надеюсь, это поможет пролить свет на основную причину этой проблемы, а именно на порядок поиска файлов заголовков.
У меня только что возникла эта ошибка при попытке скомпилировать gRPC после недавнего обновления до 10.15.4 и Xcode 11.4, и я начал смотреть на все предлагаемые решения (здесь и не могу скомпилировать программу C на Mac после обновления до Catalina 10.15), и попробовал несколько из них (хотя и не пытался воссоздать/usr/include
поскольку это нарушило бы разделение, которое Apple пыталась создать) - ничего не работало.
Затем я внимательно посмотрел на фактические вызовы компилятора, которые make
процесс производился и заметил, что был явный
-I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
это в конечном итоге привело к тому, что включения выполнялись в неправильном порядке - удаление этого явного пути включения позволило успешной компиляции с установкой по умолчанию инструментов командной строки catalina, Xcode и Xcode, как и следовало ожидать, никаких других трюков / флагов компилятора необходимо.
Переустановка Xcode, командных инструментов и homebrew, и
sudo rm -rf /usr/local/include
исправил эту проблему для меня.
Я наконец понял, почему это затрагивало только некоторых людей. Когда вышла Catalina, они перестали поставлять пакет инструментов командной строки с заголовками /usr. Обычным обходным путем было использование CPATH для указания на системные заголовки в вашем bashrc следующим образом:
export CPATH=`xcrun --show-sdk-path`/usr/include
Однако это, похоже, испортило С ++, включая порядок путей для cmath и math.h (как указано в других ответах). Хорошая новость заключается в том, что текущие сборки clang и gcc для домашних пользователей больше не нуждаются в установке CPATH для поиска системных заголовков. Таким образом, вы можете просто удалить переопределение CPATH и покончить с этим.
В моем случае это произошло, когда я создаю проект cmake llvm и создаю проект cmaked в Xcode. Эта ошибка была обнаружена при компиляции LibEdit. Я успешно скомпилировал этот проект на моем MBP, но потерпел неудачу на моем iMac. Оба они одинаковы: macOS 11.3.1, Xcode 12.5, Command Line Tools 12.5, то же самое и для других конфигураций.
Итак, я сравнил журнал cmake и нашел другое: На MBP журнал для LibEdit был:- Найден LibEdit: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include (найденная версия ".") На iMac , log Для LibEdit было:- Найдено LibEdit: /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include (найденная версия ".") Это то, что вызвало ошибку сборки.
Файлы каталога CommandLineTools точно такие же:MacOSX11.1.sdk,MacOSX11.3.sdk,MacOSX10.15.sdk, MacOSX.sdk ссылка на MacOSX11.3.sdk MacOSX11.sdk ссылка на MacOSX11.3.sdk
и оба инструмента командной строки в Xcode - Настройки - Расположение установлено на Xcode12.5(12E262)
и я переустановил Xcode и инструменты командной строки на iMac. Но бесполезно.
команда cmake указывает -DCMAKE_OSX_SYSROOT="/Library / Developer / CommandLineTools / SDKs / MacOSX11.3.sdk". По-прежнему бесполезно.
Я не знаю, где еще это установить. Наконец, я удалил MacOSX10.15.sdk, и он сработал.
@mkl "s решение помогает устранить подобную проблему на моей стороне. Спасибо.
Проблема и решение на моей стороне
У меня такая же проблема при компиляции проекта на основе PCL. Решение - установить CommandLineTools SDK CMAKE_OSX_SYSROOT.
Я пробовал решение @mkl сделать это в CMakeLists.txt, оно не работает. Так что я могу установить его толькоcmake .. -DCMAKE_OSX_SYSROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk"
Еще одно замечание: в моей MacOS есть две версии SDK командной строки:
~ » /Library/Developer/CommandLineTools/SDKs/MacOSX
/Library/Developer/CommandLineTools/SDKs/MacOSX
MacOSX.sdk/ MacOSX10.14.sdk@
xcrun --show-sdk-path
выдает значение по умолчанию, но на моей стороне работает только MacOSX10.14.sdk.
Обсуждение аналогичной проблемы в репозитории PCL: https://github.com/PointCloudLibrary/pcl/issues/2601
Разница между SDK
Я мало что знаю о cmake и SDK в C++. Разница, которую я заметил в журнале сборки cmake из разных SDK, выглядит следующим образом:
/Library/Developer/CommandLineTools/SDKs/MacOSX
:
-- Found OpenGL: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk
-- Found OpenGL: /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/OpenGL.framework
По умолчанию:
-- Found OpenGL: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/OpenGL.framework
Похоже, проблема возникает при выборе SDK для Opengl.
Как это сделать в CMakeLists.txt?
Оценил это, если кто-нибудь может посоветовать.
Объединение решений от Ryan H и Solodon решило мою проблему. Вот как я это исправил (Mac OS 10.15.7):
- Убедитесь, что вы установили Xcode.app и открыли его (что установит некоторые дополнительные материалы). Мы будем использовать компиляторы Xcode для компиляции нашего кода.
- Перейдите в файл ~/.zshrc и добавьте следующие строки, чтобы убедиться, что компилятор C++ находит нужные файлы заголовков (.h).
#############################
#Give C and C++ compilers directions to the right headers
#which are no longer in /usr/include, as expected.
#We should be using the Xcode.app libraries
XCOD="/Applications/Xcode.app/Contents/Developer"
#Append to the front of the path (reverse order, second line ends up searched first)
export PATH="$XCOD/Toolchains/XcodeDefault.xctoolchain/usr/include:$PATH"
export PATH="$XCOD/Toolchains/XcodeDefault.xctoolchain/usr/bin/:$PATH"
#Append to the end:
export PATH="$PATH:$XCOD/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"
export PATH="$PATH:$XCOD/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
#Tell compiler to use this SDK's compilers to compile C and C++ code
MYSDK="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"
export CFLAGS="-isysroot $MYSDK"
export CCFLAGS="-isysroot $MYSDK"
export CXXFLAGS="-isysroot $MYSDK"
export CPPFLAGS="-isysroot $MYSDK"
###########################
Затем заставьте эти обновления вступить в силу, запустив
source ~/.zshrc
Это заставит компилятор C++ искать заголовки (например, math.h) внутри Xcode.app в правильном порядке. Чтобы убедиться, что это сработало, введите
gcc -Wp,-v -E -
В результате должен отображаться путь, заканчивающийся на «/XcodeDefault.xctoolchain/usr/bin», а затем путь, заканчивающийся на «/XcodeDefault.xctoolchain/usr/include».
- Откройте файл "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath" и замените строку
#include <math.h>
с
#include </Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h
(Это строка 304 в моей системе). Это предотвращает попытку cmath использовать другой заголовочный файл math.h, который существует где-то еще в системе и не имеет некоторых определений, которые ожидает этот файл cmath.
- На данном этапе это должно быть излишним, но во избежание возможной путаницы вы можете переместить другие SDK (например, /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk) куда-нибудь за пределы PATH. Это предотвращает любой возможный конфликт между файлами заголовков в этом SDK и файлами заголовков с теми же именами в Xcode SDK.
Резюме: в моем случае сценарий сборки использовал старую версию ios-cmake
toolchain (2.1.2), а обновление до 3.1.2 устранило проблему включения cmath/math.
Адаптация изящной команды, предложенной @Ryan H. gcc -Wp,-v -E -
для моего случая (clang, C++, цель iOs)
clang -x c++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk -Wp, -v -E -
дает на двух Catalina, включая девственную, где установлен только инструмент XCode 11.14.1:
clang -cc1 version 11.0.3 (clang-1103.0.32.59) default target x86_64-apple-darwin19.4.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/include/c++/v1"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.3/include
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/System/Library/Frameworks (framework directory)
End of search list.
Таким образом, правильный путь включения - это первый не игнорируемый путь, все должно работать нормально, но это не так. Похоже, проблема возникла из-за дополнительной команды include, добавленной к вызову компиляции инструментальной цепочкой ios-cmake:
CompileC /Users/<...>/build.Release.ios/<...>.o <...>.cpp normal arm64 c++ com.apple.compilers.llvm.clang.1_0.compiler
-Isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk <...>
-I/Users/<...>/Build_iOS/build.Release.ios/build.arm/Binaries/Release/include
-Isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk/usr/include
-I/Users/<...>/Build_iOS/build.Release.ios/build.arm/src/<...>.build/Release-iphoneos/<...>/DerivedSources/arm64
...
Виновником был -Isystem ...
линия, которая вызовет #include <math>
в cmath-файле, чтобы в итоге загрузить неправильный файл. После долгих попыток исправить сценарии cmake я заметил старую версию ios-cmake, и ее обновление имело "единственный" эффект удаления нежелательных-Isystem
строка - все остальное было почти таким же (за исключением нескольких вариантов компилятора)
Попробуйте изменить cmath:#include <math.h> на #include "math.h". Ошибка вызвана приоритетом пути включения.
Компилятор пытается найти
math.h
и обычно он находится под
/usr/local/include
сначала, а потом ошибся.
Легкий способ исправить это - переименовать его, используя:
mv /usr/local/include/math.h /usr/local/include/math_old.h
. Затем компилятор попробует следующие подключаемые каталоги.