【发布时间】: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。