【问题标题】:c++20, clang 13.0.0, u8string supportc++20, clang 13.0.0, u8string 支持
【发布时间】:2023-03-05 18:10:02
【问题描述】:

我在基于 CMAKE 的项目中使用 clang 13.0.0,CMAKE_CXX_STANDARD 定义为 20。以下代码导致编译错误(命名空间 'std' 中没有名为 'u8string' 的类型):

#include <iostream>
#include <string>

int main() {
#ifdef __cpp_char8_t
    std::u8string sss = u8"a";  // <---- this branch is picked up
#else
    std::string sss = "b"
#endif    
return 0;
}

下面是 CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)

project(clang_test)

add_executable(clang_test main.cpp)

是我遗漏了什么还是一个clang错误?我的意思是,如果 std::u8string 还不存在,则不应定义宏,对吗?顺便说一句,如果您知道使用 CMake 以某种方式取消定义它的方法,请分享您的经验。 Here这个话题发起者也面临同样的问题,我想,但目前还没有提出解决方案。

更新:平台为 RHEL 8.4

更新 2:将“项目”调用移到 CMakeLists.txt 中的编译器设置下方

【问题讨论】:

  • I mean, if std::u8string is not yet there, the macro shouldn't be defined, right? 不。它部分支持 C++20 - 足以允许编译器标志。如果要等待完全支持,该宏将在很长一段时间内都是错误的。他们还没有完全实现 C++17。
  • 这发生在哪个平台/工具链上?我不能轻易地重现这一点。我的猜测是,clang 正在从系统的其他地方获取一个较旧的 stdlib。
  • @ALX23z AFAIK,所有现代编译器/stdlibs 提供完整的char8_t / std::u8string 支持:gcc.godbolt.org/z/8o1j13T1Y
  • 根据 clang-13 的安装方式,target_compile_options(clang_test PRIVATE -stdlib=libc++) 可能会成功。
  • 顺便说一句,在project 调用之后设置编译器是错误的。有关详细信息,请参阅我的答案:stackoverflow.com/a/63944545/3440745

标签: c++ cmake clang c++20


【解决方案1】:

Frank's 的建议是正确的 - 问题在于 Clang 使用的是旧版本的 libstdc++ 而不是 libc++;

target_compile_options(clang_test PRIVATE -stdlib=libc++) 

为我解决了这个问题。虽然我不完全理解为什么它不适用于 libstdc++,但如果您有任何想法,请分享here - 我认为这是一个单独的问题。

另外,Tsyvarev's点确实是一个很重要的点,编译器要在工程调用前设置好。我已经更正了我的问题中的示例。

更新:终于明白失败的原因了:__cpp_char8_t对于std::u8string是不够的,应该用__cpp_lib_char8_t代替。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2022-01-07
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多