将 llvm-11 与使用 -std=c++2a 编译的 gcc-11 中的标准库 headers 结合使用时出错

Error using llvm-11 in combination with standard library headers from gcc-11 compiling with -std=c++2a

我正在尝试将 clang 与 gcc 标准库一起使用 headers,如下所示:

/opt/rh/llvm-toolset-11.0/root/usr/bin/clang -MD -MF bazel-out/k8-fastbuild/bin/external/com_google_googletest/_objs/gtest/gtest-typed-test.d '-frandom-seed=bazel-out/k8-fastbuild/bin/external/com_google_googletest/_objs/gtest/gtest-typed-test.o' -iquote external/com_google_googletest -iquote bazel-out/k8-fastbuild/bin/external/com_google_googletest -isystem external/com_google_googletest/googlemock -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googlemock -isystem external/com_google_googletest/googlemock/include -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googlemock/include -isystem external/com_google_googletest/googletest -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googletest -isystem external/com_google_googletest/googletest/include -isystem bazel-out/k8-fastbuild/bin/external/com_google_googletest/googletest/include -isystem /opt/rh/devtoolset-11/root/usr/include/c++/11 -isystem /opt/rh/devtoolset-11/root/usr/include/c++/11/bits -isystem /opt/rh/devtoolset-11/root/include/c++/11/x86_64-redhat-linux/bits -fdiagnostics-color -Wfatal-errors '-std=c++2a' -Wall -Wno-sign-compare '--gcc-toolchain=/opt/rh/devtoolset-11/root' -Wheader-guard -pthread -c external/com_google_googletest/googletest/src/gtest-typed-test.cc -o bazel-out/k8-fastbuild/bin/external/com_google_googletest/_objs/gtest/gtest-typed-test.o

然后我得到这个错误:

In file included from external/com_google_googletest/googletest/include/gtest/gtest.h:62:
In file included from external/com_google_googletest/googletest/include/gtest/internal/gtest-internal.h:40:
In file included from external/com_google_googletest/googletest/include/gtest/internal/gtest-port.h:395:
/opt/rh/devtoolset-11/root/usr/include/c++/11/bits/regex.h:56:9: fatal error: use of undeclared identifier 'regex_constants'
                      regex_constants::match_flag_type     __flags);

错误的原因可能是什么? gcc 和 clang 之间是否不兼容?我应该改为安装 clang headers 和 libc++ 并且是通过安装软件包 llvm-dev 制作的吗?

gtest-port.h 文件包含一个带有 #include <regex.h> 的文件(请参阅 here 了解代码)。它期望文件是 POSIX regex.h,通常直接安装在前缀 /usr/include 下。正如您在错误消息中看到的那样,编译器反而尝试包含 /usr/include/c++/11/bits/regex.h 这是错误的文件。

.../bits/ 中的头文件不应该由用户代码直接包含。 内部标准库实现。因此,直接包含它失败对我来说并不奇怪(缺少的符号可能在另一个内部头文件中定义)。

为了解决您的问题,我建议您尝试在编译命令中省略 .../bits 目录*。我不知道是谁告诉你要包含它们的,但它们并不是要添加到编译器搜索路径中。

* 从编译器命令行删除这两个标志:

-isystem /opt/rh/devtoolset-11/root/usr/include/c++/11/bits
-isystem /opt/rh/devtoolset-11/root/include/c++/11/x86_64-redhat-linux/bits