Catalina C ++: Використання заголовків <cmath> приводить до помилки: у глобальному просторі імен жоден член не названий "signbit"


16

Після оновлення до Каталіни з Mojave, Налаштування: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk in env.

Я не можу скласти програму, яка використовує <cmath>заголовок.

Я спробував змінити CFLAGS, CCFLAGS, CXXFLAGS, щоб вказати на MacOSSDK Location, які нічого не змінюють

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знаходиться.
roman Sztergbaum

Це не добре. Код намагається зробити, 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 на Каталіні може зробити для вашого середовища побудови.

(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 / включити відсутні на macOS Catalina (з Xcode 11)


1
set(CMAKE_OSX_SYSROOT ...)переходить у CMakeLists.txt, а не в оболонку.
мкл

6

У мене виникають ті ж проблеми, коли я намагаюся націлити на iOS (як на моєму MacBook Air, так і на бігуні GitHub Actions), і ось ще кілька думок щодо цієї проблеми, хоча я недостатньо знайомий з екосистемою 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;
      ~~^

Єдині два каталоги, що передаються в моєму початковому командному рядку, існують:

$ 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

ви бачите, що каталог, що включає специфічну для системи, закінчується над каталогом стандартних бібліотек, введеним Clang, і саме тому math.hзнайдено специфічну для системи , а не ту, що знаходиться в тій же папці, що й решта стандартних заголовків бібліотеки. Це, мабуть, так, тому що якщо я явно додам до стандартної бібліотеки включати каталог до мого командного рядка ДО ДЕРЕВИШЕ двох інших каталогів, -isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1проблема відходить, і я можу скласти файл. Це не те, що драйвер Кланг або що-небудь інше тут бере участь автоматично: він додає цей стандартний каталог бібліотеки через -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

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

Аналіз @ solodon не виявлено. Ймовірно, що 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 ++ код.

Якщо ви прийшли сюди, шукаючи рішення цієї проблеми, вам може знадобитися інше рішення, але, сподіваємось, це допоможе пролити світло на те, що, здається, є першопричиною цієї проблеми, порядок пошуку шляху пошуку файлів заголовка.


1

Використання команди:

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, і збірка успішна зараз!

І дякую Солодону за детальну відповідь. Я пішов за відповіддю, щоб виправити проблему.


Привіт Нілой Датта! Я пропоную вам відредагувати цю відповідь, видаливши питання з цієї відповіді та включивши лише відповіді. Якщо у вас є питання, то задайте окремо належним чином питання, які слід задавати в цій спільноті.
Tiago Martins Peres 李大仁

1
@TiagoMartinsPeres 李大仁, видалив її. Дякую.
Найлой Датта

0

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


0

Я щойно отримав цю помилку при спробі компілювати 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, як можна було б очікувати, жодних інших хитрощів / прапорців компілятора потрібні.


Я також зіткнувся з цим питанням. Виявляється, деякі pkg-configфайли (наприклад, libcurl) від Homebrew додають цей шлях автоматично, навіть якщо у вас встановлений Xcode. Це було зафіксовано в домашній мові 2.2.13. Детальніше у github.com/Homebrew/brew/isissue/5068 ; PR, який це виправляє, знаходиться в github.com/Homebrew/brew/pull/7331 . TL; DR: Оновити домашню мову
kkaefer

Так, це був старий домашній pkg_config для zlib, який все ще якимось чином лежав, це спричиняло це для мене, - незважаючи на те, що у нас є сучасний домашній
пив,

0

Ви можете спробувати використовувати SDK CommandLineTools, а не SDC XCode.app.

Я вирішую цю проблему, коли компілюю 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-cmakeінструментального ланцюга (2.1.2), і оновивши його до 3.1.2, виправлено проблему включення cmath / math.

Адаптація вишуканої команди, запропонованої @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 -

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.