Поддержка библиотеки C++20 для xcode 12

Могу ли я использовать библиотеку C++ 20 с xcode 12? (xcode 12 beta 5, версия clang 10.0.0).

поэтому в настройках сборки xcode вместо

// in xcode build settings, "c++ standard library"
CLANG_CXX_LIBRARY = libc++

возможно, использовать что-то вроде (не работает => clang err: неверное имя библиотеки)

CLANG_CXX_LIBRARY = libc++20 // eg. libc++20 & libc++2a are invalid names

я уже установил (работает, обеспечивая поддержку языка C++ 20, но не обеспечивает поддержку библиотеки C++ 20)

// in xcode build settings, "c++ language dialect"
CLANG_CXX_LANGUAGE_STANDARD = c++2a // ok but does not provide c++20 library

Я знаю, что библиотека C++ 20 еще не завершена / официально выпущена.

вопрос:

знаете ли вы какой-либо (простой) способ использовать (предварительную) библиотеку C++ 20 с xcode 12?

Благодарность

1 ответ

Решение

Могут быть более простые способы, или я мог сделать что-то лишнее (дайте мне знать, что можно удалить), но вот верный способ.

Создайте llvm с

cmake -G "Sublime Text 2 - Ninja" -DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS=“clang;libcxx;libcxxabi” -DCMAKE_CXX_STANDARD=17 -DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_CCACHE_BUILD=ON -DLLVM_CREATE_XCODE_TOOLCHAIN=ON \
-DCMAKE_INSTALL_PREFIX="easy to clean location"\
-DLLVM_ENABLE_RTTI=ON \
../llvm

libcxxabi требуется или ссылка libcxx потерпит неудачу с:

ld: библиотека не найдена для -lcxxabi_shared clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

DLLVM_CCACHE_BUILDтребуется https://ccache.dev/ (при желании используйте brew).


После того, как это будет сделано и ninja скомпилирует около 3000 файлов, запустите

 ninja install all 
 ninja install build-xcode-toolchain

Найдите созданный набор инструментов в location you chose above/Toolchains. Скопируйте его в~/Library/Developer/Toolchains/


Если Xcode открыт, закройте его и снова откройте. В меню приложения Xcode> Toolchains > выберите новый, llvm12git.

Создайте новый проект C++ обычным образом и перейдите к настройкам сборки его проекта.

Искать COMPILER_INDEX_STORE_ENABLE или Enable index-while-building functionalityи установите его на "Нет". В противном случае сборка завершится неудачно с "нераспознанной опцией" индексации.


Измените "диалект языка C++" на "C++20" или "C++2a"

Постройте проект нормально. Однако предупреждения могут не исчезнуть, пока код успешно строится из-за отключения индексации.:(Добавление пути поиска по заголовку помогает с предупреждениями.


Обязательно проверьте статус функции:

Код, который я тестировал:

#include <compare>
#include <concepts>

struct Aggr {
  int i;
  char c;

  auto operator<=>(Aggr const &) const = default;
};
struct A {
  int x;
  int y;
  int z;
};
int main()
{

  // A a{.y = 2,.x = 1};  // error; designator order does not match declaration
  // order
  A b{.x = 1, .z = 2};  // ok, b.y initialized to 0
  return 0;

}
Другие вопросы по тегам