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

16

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

Я не могу скомпилировать программу, которая использует <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

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

Роман Штергбаум
источник
Совпадает ли xcode-select -pгде Xcode находится? Можете ли вы изменить код using std::signbit;, аналогично для других? Вы компилируете как C ++ 11 или новее?
Eljay
Компиляция как C ++ 11. Я не могу изменить код, это внешние зависимости! да xcode-select -pсовпадать, где XCodeнаходится.
Роман Штергбаум
Это не хорошо. Код пытается это сделать, using ::signbit;и символ находится не в глобальном пространстве имен, а в std::пространстве имен. Я полагаю также с другими (я не преследовал их).
Eljay

Ответы:

7

Мне интересно: какой компилятор вы используете? Какова стоимость 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)

мКЛ
источник
1
set(CMAKE_OSX_SYSROOT ...)входит CMakeLists.txt, а не в оболочку.
MKL
6

У меня возникла та же проблема при попытке нацелить iOS (как на MacBook Air, так и на GitHub Actions runner), и вот еще несколько соображений по этой проблеме, хотя я недостаточно знаком с экосистемой Apple, чтобы предложить правильное решение. Исходная командная строка исходила от CMake в cpprestsdk, но как только я свел ее к основам, вот короткое повторение.

  1. Создайте файл cmath-bug.cppс единственной строкой в ​​нем:
    #include <cmath>
  1. Выполнить (переводы строки перед некоторыми аргументами предназначены для удобства чтения, удалите их)
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;
      ~~^

Существуют только две директории include, которые я передаю в исходной командной строке:

$ 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
 ...

Но интересными моментами здесь являются несуществующие каталоги включения, о которых он сообщает, а также каталоги включения, которые он в конечном итоге ищет, и их порядок. Я предполагаю, что дополнительные каталоги, не упомянутые в командной строке, вставляются драйвером 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-Injected, именно поэтому находится системный каталог, а не тот, который находится 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
solodon
источник
2

Используя команду:

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, и теперь сборка прошла успешно!

И спасибо Солодону за подробный ответ. Я последовал за ответом, чтобы исправить проблему.

Нилой Датта
источник
Привет, Нилой Датта! Я предлагаю вам отредактировать этот ответ, исключив вопрос из этого ответа, и включить только те ответы. Если у вас есть вопрос, задавайте его отдельно в этом сообществе.
Тиаго Мартинс Перес 李大仁
1
@TiagoMartinsPeres 李大仁, удалил его. Спасибо.
Нилой Датта
Спасибо человек, это сработало для меня. Вы знаете более чистый способ решения этой проблемы?
Виктор Санчес
1

Возможно, ваша копия 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 был пуст во всех вышеперечисленных местах.

Роб Нейпир
источник
1

Анализ @ Солодона точен. Вероятно, проблема заключается в том, что cmathфайл содержит неверную версию в math.hзависимости от порядка поиска файлов заголовков. По крайней мере, это то, что происходило со мной, когда я получал ту же ошибку.

Сканирование вывода компилятора для #include <...> search starts here:. Вы также можете форсировать этот вывод из командной строки с помощью (source) :

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 ++.

Если вы пришли сюда в поисках решения этой проблемы, вам может потребоваться другое решение, но, надеюсь, это поможет пролить свет на то, что, по-видимому, является основной причиной этой проблемы, - порядок пути поиска файла заголовка.

Райан Х.
источник
0

Я обнаружил, что внутри моего проекта у меня есть файл math.h. После переименования проблема исчезла. Швы cmathвключают мой файл вместо системы.

Gralex
источник
0

Я только что получил эту ошибку при попытке скомпилировать gRPC после недавнего обновления до 10.15.4 и Xcode 11.4, и я начал смотреть на все предлагаемые решения (здесь и не могу скомпилировать программу C на Mac после обновления до Catalina 10.15 ) и попробовал несколько из них (хотя не пытался воссоздать, /usr/includeпоскольку это нарушило бы разделение, которое Apple пыталась создать) - ничего не получалось.

Затем я внимательно посмотрел на фактические вызовы complier, которые производил makeпроцесс, и заметил, что существует явный

-I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include

это в конечном итоге приводило к тому, что включения выполнялись в неправильном порядке - удаление этого явного пути включения позволило успешно завершить компиляцию с установкой по умолчанию инструментов catalina, Xcode и Xcode, как и следовало ожидать, без других трюков / флагов компилятора необходимо.

pahjbo
источник
Я столкнулся с этой проблемой также. Оказывается, некоторые pkg-configфайлы (например, libcurl) из Homebrew добавляют этот путь автоматически, даже если у вас установлен Xcode. Это было исправлено в Homebrew 2.2.13. Более подробная информация на github.com/Homebrew/brew/issues/5068 ; PR, который исправляет это, находится на github.com/Homebrew/brew/pull/7331 . TL; DR: Обновление доморощенного
kkaefer
Да, это был старый доморощенный pkg_config для zlib, который все еще как-то валялся, что вызывало это для меня - несмотря на то, что у меня был современный homebrew и в настоящее время не установлен zlib
pahjbo
0

Вы можете попытаться использовать 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.

Лестер Ло
источник
0

Резюме: в моем случае сценарий сборки использовал более старую версию ios-cmaketoolchain (2.1.2), а обновление до 3.1.2 устранило проблему cmath / math include.

Адаптация отличной команды, предложенной @Ryan H. gcc -Wp,-v -E -для моего случая (clang, c ++, iOs target)

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.

Таким образом, правильный путь включения - первый, который игнорируется, все должно работать хорошо, но это не так. Похоже, что проблема возникла из-за дополнительной команды включения, добавленной к вызову компиляции цепочкой инструментов 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строки - все остальное было почти таким же (за исключением нескольких опций компилятора)

Spikegee
источник