Поддержка длинных длинных операций в стандартной математической библиотеке C ++? (Apple силикон, macOS 11.3)

На прошлой неделе я бился головой об стену, пытаясь скомпилировать проект на моем M1 Mac Mini (macOS Big Sur 11.4). Публикация здесь, а не как проблема на странице проекта Github, потому что это похоже на общую проблему с набором инструментов. (Примечание: я смог скомпилировать тот же код без каких-либо проблем на моей машине Win10 под WSL2 с дистрибутивом на основе Debian и всеми зависимостями, установленными через apt-get)

Ошибка (одна из многих, но все они связаны с долгой вариацией функций):

In file included from include/trick/Clock.hh:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/string:506:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/string_view:175:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/__string:57:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/algorithm:643:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/memory:668:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/typeinfo:60:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/exception:81:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/cstdlib:85:
/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/stdlib.h:148:12: error: no member named 'lldiv' in the global namespace; did you mean 'ldiv'?
  return ::lldiv(__x, __y);

Я пробовал следовать советам некоторых комментариев в эта ветка, но никто не помог.

  • Установил XCode.app, изменил путь к SDK и удалил каталог CLT (с тех пор я вернулся к установке только CLT)
  • Добавлено set(CMAKE_OSX_SYSROOT /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk) в CMakeLists.txt проекта
  • Явная установка clang, gcc, g ++ и т. Д. В качестве компилятора во флагах ./configure
  • Явное включение -I/path/to/MacOSX.sdk/usr/include в CXXFLAGS, установленное в ./configure
eric@Mac-Wahlberg ~ 
╰─$ clang -v                                                                                    1 ↵
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: arm64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

╭─eric@Mac-Wahlberg ~ 
╰─$ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: arm64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

╭─eric@Mac-Wahlberg ~ 
╰─$ g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: arm64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

╭─eric@Mac-Wahlberg ~ 
╰─$ xcrun --sdk macosx --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

eric@Mac-Wahlberg ~/Code/trick ‹15534f7› 
╰─$ gcc -Wp,-v -E -
clang -cc1 version 12.0.5 (clang-1205.0.22.11) default target arm64-apple-darwin20.5.0
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Library/Developer/CommandLineTools/usr/lib/clang/12.0.5/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
 /Library/Developer/CommandLineTools/usr/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.

Еще несколько терминальных копипаст, которые могут быть полезны, а могут и не пригодиться

╭─eric@Mac-Wahlberg ~/Code/trick ‹15534f7*› 
╰─$ cat /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/C++/v1/stdlib.h | grep "lldiv"
    lldiv_t                                                               // C99
lldiv_t   div(long long numer, long long denom);                          // C++0X
lldiv_t lldiv(long long numer, long long denom);                          // C99
#undef lldiv
inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x,
  return ::lldiv(__x, __y);


person Eric P.    schedule 17.07.2021    source источник
comment
Что действительно было бы полезно увидеть, так это исходный код минимального воспроизводимого примера.   -  person Nate Eldredge    schedule 22.07.2021


Ответы (1)


В сообщении об ошибке говорится, что в глобальном пространстве имен нет lldiv, это не обязательно, std::lldiv должен присутствовать в соответствующих размещенных реализациях из C ++ 11. Попробуйте скомпилировать с -std=c++20 У меня нет проблем с macOS 11 (не могу говорить о macOS 12)

Изменить: игнорируйте сообщение выше, это всего лишь придирки.

Убедитесь, что вы компилируете с -std=c++11 или выше. например:

cd ~/Desktop;\
echo '#include <cmath>\nint main(){}' > main.cxx;\
xcrun -r clang++ -std=c++11 main.cxx -o Main;\
./Main && printf '%s\n' Success.

Это должно напечатать «Успех».

Если не запустите это:

xcode-select -p

Это печатает путь к папке разработчика. Если это не так: /Applications/Xcode.app/Contents/Developer

Сначала запустите это

xcode-select --install

ЕСЛИ он не говорит: xcode-select: error: command line tools are already installed, use "Software Update" to install updates остановитесь, где вы находитесь, и обновите / установите Xcode из Mac App Store

Иначе:

sudo xcode-select --reset && xcode-select -p

Он должен напечатать /Applications/Xcode.app/Contents/Developer

person ViralTaco_    schedule 17.07.2021
comment
Гм, ошибка возникает в стандартном заголовке stdlib.h, и, поскольку это заголовок C, lldiv должен находиться в глобальном пространстве имен. В лучшем случае это проблема с установкой компилятора; в худшем случае проблема с компилятором. - person Pete Becker; 17.07.2021
comment
@PeteBecker Да, но нет. Если вы читаете первое сообщение об ошибке, вы видите, что заголовок c включен из cstdlib In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk/usr/include/c++/v1/cstdlib:85: это стандартная практика для разработчиков llvm включать заголовок c, а затем добавляя В пространство имен std много using ::FooFromCheader, что говорит, что стандарт НЕ гарантирует, что что-либо быть включенным в глобальное пространство имен, и вы не должны на это полагаться. Кроме того, если lldiv определен в глобальном пространстве имен, что касается C ++, он не обязательно должен быть из stdlib. - person ViralTaco_; 22.07.2021