React Native 환경에서 XCode 업데이트 이후에 발생하는 오류에 대해서 이를 해결하는 방법에 대해서 알아봅니다.
1) 문제점
💡 문제점 - 최근에 XCode 26.4.1 버전으로 업데이트를 한 이후에 아래와 같은 문제가 발생하였습니다.
- /workspace/3ha/3ha-chon-calc-quiz/ios/Pods/fmt/include/fmt/format-inl.h:59:24 Call to consteval function 'fmt::basic_format_string<char, fmt::basic_string_view<char> &, const char (&)[3]>::basic_format_string<FMT_COMPILE_STRING, 0>' is not a constant expression
2) 해결방법
💡 해결방법
- 현재의 문제는 fmt 라이브러리의 consteval / C++20 기능이 구버전 C++ 표준으로 컴파일되면서 발생한 충돌하는 문제입니다.
- fmt 라이브러리 최신 버전은 consteval 키워드를 사용하는데, 이건 C++20에서 도입된 문법이기에 이에 맞지않아 발생하는 문제입니다. - 현재에서 발생한 에러에서는 Xcode가 해당 파일을 C++14 또는 C++16 이하로 컴파일하려 했기 때문에 발생하는 문제이며, consteval을 모르는 컴파일러 버전 기준으로 해석하다 보니 "상수 표현식이 아니다"라는 엉뚱한 에러가 발생하는 것입니다.
💡 그렇기에 아래와 같이 Podfile 내에 수정을 하였습니다.
- CLANG_CXX_LANGUAGE_STANDARD = 'c++17’ : C++ 언어 표준을 C++17로 명시하였습니다. - CLANG_CXX_LIBRARY = 'libc++’ : 표준 라이브러리 구현체를 libc++로 강제하였습니다.
- fmt 최신 버전은 최소 C++17 이상을 요구하므로, 명시적으로 올려줘야 정상 컴파일이 됩니다.
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_CXX_LIBRARY'] = 'libc++'
if target.name == 'fmt'
target.build_configurations.each do |config|
config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17'
end
end
end
end
[더 알아보기] 💡 fmt 라이브러리는 뭘까?
- fmt는 C++에서 printf / std::string 문자열 포매팅을 타입 안전하게 해주는 라이브러리입니다. - 주로 React Native에서는 Folly가 내부적으로 많이 써서 RN 프로젝트에서 사용이 됩니다.