xcode 12에 대한 C ++ 20 라이브러리 지원
xcode 12에서 C ++ 20 라이브러리를 사용할 수 있습니까? (xcode 12 베타 5, clang 버전 10.0.0 포함).
그래서 xcode 빌드 설정에서
// in xcode build settings, "c++ standard library"
CLANG_CXX_LIBRARY = libc++
아마도 다음과 같은 것을 사용할 수 있습니다 (작동하지 않음 => clang err : invalid library name)
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 라이브러리가 아직 완전하거나 공식적으로 출시되지 않았다는 것을 알고 있습니다.
질문:
xcode 12에서 (예비) C ++ 20 라이브러리를 사용하는 (쉬운) 방법을 알고 있습니까?
감사
답변
더 쉬운 방법이있을 수도 있고 중복 된 작업을 수행했을 수도 있지만 (제거 할 수있는 항목을 알려주세요) 확실한 방법이 있습니다.
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=OFF \
../llvm
- http://clang.llvm.org/get_started.html
- https://llvm.org/docs/CMake.html
libcxxabi필요하지 않거나 연결 libcxx이 실패합니다.
ld : -lcxxabi_shared clang에 대한 라이브러리를 찾을 수 없음 : 오류 : 링커 명령이 종료 코드 1로 실패했습니다 (호출을 보려면 -v 사용).
DLLVM_CCACHE_BUILD 필요하다 https://ccache.dev(원하는 경우 양조주 사용). 첫 번째 빌드는 매우 느립니다. 재 구축이 더 빨라집니다.
위의 작업이 완료되고 ninja가 약 3000 개의 파일을 컴파일 한 후 다음을 실행합니다.
ninja install all
ninja install build-xcode-toolchain
에서 생성 된 도구 모음을 찾습니다 location you chose above/Toolchains. 복사~/Library/Developer/Toolchains/
Xcode가 열려 있으면 닫았다가 다시 엽니 다. Xcode 앱 메뉴> 도구 모음> 새 llvm12git을 선택합니다.
새 C ++ 프로젝트를 정상적으로 만들고 해당 프로젝트의 빌드 설정으로 이동합니다.
COMPILER_INDEX_STORE_ENABLE또는 검색 Enable index-while-building functionality하여 "아니오"로 설정합니다. 그렇지 않으면 인덱싱에 대한 "인식 할 수없는 옵션"으로 빌드가 실패합니다.
"C ++ 언어 방언"을 "c ++ 20"또는 "c ++ 2a"로 변경
프로젝트를 정상적으로 빌드하십시오. 그러나 인덱싱이 비활성화되어 코드가 성공적으로 빌드되는 동안 경고가 사라지지 않을 수 있습니다. :( 헤더 검색 경로를 추가하면 경고에 도움이됩니다.
- Xcode에 시스템 헤더 검색 경로 추가
기능 상태를 확인하십시오.
- http://clang.llvm.org/cxx_status.html
- https://en.cppreference.com/w/cpp/20
내가 테스트 한 코드 :
#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;
}