После обновления до Каталины из Мохаве, настройка: /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 или новее?xcode-select -p
совпадать, гдеXCode
находится.using ::signbit;
и символ находится не в глобальном пространстве имен, а вstd::
пространстве имен. Я полагаю также с другими (я не преследовал их).Ответы:
Мне интересно: какой компилятор вы используете? Какова стоимость
CMAKE_OSX_SYSROOT
?Я справедливо убежден, что это результат неправильного
CMAKE_OSX_SYSROOT
. У меня была проблема, которую вы описываете при использовании привязок python для clang (где CMake не управляет вызовом компилятора), но мне удалось воссоздать ошибку в CMake, выполнив:Я решил свою проблему, следуя ответам на этот вопрос: Невозможно скомпилировать пакеты 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, но попробуйте сделатьили
Если это решит проблему, вы можете найти лучший способ сделать это в CMake.
Конечно, если вы любите приключения, вы также можете отключить SIP, как предложено в ответе на мой вопрос: / usr / include отсутствует в macOS Catalina (с Xcode 11)
источник
set(CMAKE_OSX_SYSROOT ...)
входитCMakeLists.txt
, а не в оболочку.У меня возникла та же проблема при попытке нацелить iOS (как на MacBook Air, так и на GitHub Actions runner), и вот еще несколько соображений по этой проблеме, хотя я недостаточно знаком с экосистемой Apple, чтобы предложить правильное решение. Исходная командная строка исходила от CMake в cpprestsdk, но как только я свел ее к основам, вот короткое повторение.
cmath-bug.cpp
с единственной строкой в нем:Когда я запускаю его, я знакомлюсь со многими, сталкивающимися с той же проблемой:
Существуют только две директории include, которые я передаю в исходной командной строке:
Но интересными моментами здесь являются несуществующие каталоги включения, о которых он сообщает, а также каталоги включения, которые он в конечном итоге ищет, и их порядок. Я предполагаю, что дополнительные каталоги, не упомянутые в командной строке, вставляются драйвером Apple Clang на основе определенной логики Apple.
Из сообщения об ошибке видно, что
<cmath>
заголовок находится по адресу:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
и в строке 304 его можно увидеть:Судя по тому, что в этой же папке
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/
находится файлmath.h
, содержащий необходимые определения, например:авторы
<cmath>
ожидали,math.h
что сначала из этой же папки будет включена#include_next <math.h>
директива, а затем директива найдет специфичную для системыmath.h
. Однако это не то, что происходит в реальности.Если вы посмотрите на первые 2 записи в найденных каталогах:
вы видите, что специфичный для системы каталог include оказывается выше каталога стандартной библиотеки Clang-Injected, именно поэтому находится системный каталог, а не тот, который находится
math.h
в той же папке, что и остальные заголовки стандартной библиотеки. Скорее всего, это так, потому что, если я явно добавлю директорию include стандартной библиотеки в мою командную строку ДО двух других каталогов,-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
проблема исчезнет, и я смогу скомпилировать файл. Это не то, что драйвер Clang или что-либо еще, что задействовано здесь, делает автоматически: он добавляет этот стандартный каталог библиотеки через-internal-system
(не уверен, какова семантика этого внутреннего флага) и добавляет его ПОСЛЕ системного каталога.Теперь, если вы посмотрите на список игнорируемых каталогов, самая первая запись в этом списке:
из которых последняя
c++/v1
часть не существует на моем компьютере, поэтому я задаюсь вопросом, должна ли установка iPhone SDK создать символическую ссылкуc++
внутри существующей части пути, чтобы указать/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
каталог, чтобы все это работало.Во всяком случае, это то, что я думаю, что происходит, и мне интересно, если кто-нибудь знает, как правильно это исправить?
Спасибо!
PS Для контекста:
источник
Используя команду:
моя #include <...> последовательность поиска:
Причина ошибки #include описана ниже:
Исправление:
Я выбрал вариант №2, и теперь сборка прошла успешно!
И спасибо Солодону за подробный ответ. Я последовал за ответом, чтобы исправить проблему.
источник
Возможно, ваша копия XCode повреждена. Проверьте с помощью кода:
Это случилось со мной, и проблема была повреждена Xcode. Переустановка исправила.
Что-то изменило следующее:
math.h
был пуст во всех вышеперечисленных местах.источник
Анализ @ Солодона точен. Вероятно, проблема заключается в том, что
cmath
файл содержит неверную версию вmath.h
зависимости от порядка поиска файлов заголовков. По крайней мере, это то, что происходило со мной, когда я получал ту же ошибку.Сканирование вывода компилятора для
#include <...> search starts here:
. Вы также можете форсировать этот вывод из командной строки с помощью (source) :Это должно выглядеть примерно так:
Обратите внимание, что пути с
Toolchains
предшествуют тем, с которымиPlatforms
. Если в вашем случае порядок обратный, вам нужно выяснить, что в вашей конфигурации вызывает это. Для меня это была явная настройкаCPLUS_INCLUDE_PATH
в моем сценарии входа.Оскорбительный код:
Это было частью моей попытки обойти Xcode 11, больше не предоставляя установочный пакет для заголовочных файлов SDK. После удаления этого кода я смог успешно включить
cmath
в мой код C ++.Если вы пришли сюда в поисках решения этой проблемы, вам может потребоваться другое решение, но, надеюсь, это поможет пролить свет на то, что, по-видимому, является основной причиной этой проблемы, - порядок пути поиска файла заголовка.
источник
Я обнаружил, что внутри моего проекта у меня есть файл
math.h
. После переименования проблема исчезла. Швыcmath
включают мой файл вместо системы.источник
Я только что получил эту ошибку при попытке скомпилировать gRPC после недавнего обновления до 10.15.4 и Xcode 11.4, и я начал смотреть на все предлагаемые решения (здесь и не могу скомпилировать программу C на Mac после обновления до Catalina 10.15 ) и попробовал несколько из них (хотя не пытался воссоздать,
/usr/include
поскольку это нарушило бы разделение, которое Apple пыталась создать) - ничего не получалось.Затем я внимательно посмотрел на фактические вызовы complier, которые производил
make
процесс, и заметил, что существует явныйэто в конечном итоге приводило к тому, что включения выполнялись в неправильном порядке - удаление этого явного пути включения позволило успешно завершить компиляцию с установкой по умолчанию инструментов catalina, Xcode и Xcode, как и следовало ожидать, без других трюков / флагов компилятора необходимо.
источник
pkg-config
файлы (например, libcurl) из Homebrew добавляют этот путь автоматически, даже если у вас установлен Xcode. Это было исправлено в Homebrew 2.2.13. Более подробная информация на github.com/Homebrew/brew/issues/5068 ; PR, который исправляет это, находится на github.com/Homebrew/brew/pull/7331 . TL; DR: Обновление доморощенногоВы можете попытаться использовать CommandLineTools SDK, а не XCode.app SDK.
Я исправляю эту проблему при компиляции PointCloudLibrary (PCL)
Также может помочь переустановка XCode.app и CommandLineTools.
источник
Резюме: в моем случае сценарий сборки использовал более старую версию
ios-cmake
toolchain (2.1.2), а обновление до 3.1.2 устранило проблему cmath / math include.Адаптация отличной команды, предложенной @Ryan H.
gcc -Wp,-v -E -
для моего случая (clang, c ++, iOs target)выход на двух Catalina, включая девственный, где единственным установленным инструментом является XCode 11.14.1:
Таким образом, правильный путь включения - первый, который игнорируется, все должно работать хорошо, но это не так. Похоже, что проблема возникла из-за дополнительной команды включения, добавленной к вызову компиляции цепочкой инструментов ios-cmake:
Виновником была
-Isystem ...
строка, которая приведет к тому, что#include <math>
строка в файле cmath закончит загрузку не того файла. После долгих попыток исправить скрипты cmake я заметил старую версию ios-cmake, и обновление ее имело «единственный» эффект удаления ненужной-Isystem
строки - все остальное было почти таким же (за исключением нескольких опций компилятора)источник