编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’
- 一、问题描述
- 二、原因分析
- 三、升级gcc版本
- 四、验证
一、问题描述
在一个新的Redhat7.6 linux虚拟机上,将gtest clone下来之后编译,一堆报错:
/opt/googletest/googletest/include/gtest/gtest-matchers.h: In static member function ‘static constexpr bool testing::internal::MatcherBase<T>::IsInlined()’:
/opt/googletest/googletest/include/gtest/gtest-matchers.h:434:12: error: ‘is_trivially_copy_constructible’ is not a member of ‘std’
std::is_trivially_copy_constructible<M>::value &&
^
/opt/googletest/googletest/include/gtest/gtest-matchers.h:434:50: error: expected primary-expression before ‘>’ token
std::is_trivially_copy_constructible<M>::value &&
^
/opt/googletest/googletest/include/gtest/gtest-matchers.h:434:51: error: ‘::value’ has not been declared
二、原因分析
到GoogleTest官网查阅GoogleTest的最低要求, 其要求的gcc编译器版本最低是5.0
查看本机gcc版本, 发现是4.8版本, 应该就是gcc版本过低导致的。
[root@192 rh]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
三、升级gcc版本
升级gcc版本的方式多种多样,你可以直接下载一个最新的gcc源码进行编译,但这种方式非常麻烦,编译过程中也可能遇到各种千奇百怪的错误。并且使用新的gcc版本后,一些老代码不一定能编译通过。出于稳定性和兼容性考虑,很多时候我们并不希望把老的gcc完全废弃掉,而是希望能够根据自己的需要,自由地切换gcc版本。
在Redhat中,提供了专门的工具包来管理gcc版本,通过使用工具包的方式,就可以随时切换gcc版本,而不破坏原有的gcc环境。例如:
gcc-toolset-12对应gcc12.x.x版本
gcc-toolset-11对应gcc11.x.x版本
gcc-toolset-10对应gcc10.x.x版本
gcc-toolset-9对应gcc9.x.x版本
以此类推
关于Red Hat Developer Toolset的说明:
Red Hat Developer Toolset delivers the latest stable versions of essential GCC C, C++, Fortran, and supporting development tools to enhance developer productivity and improve deployment times.
Red Hat Developer Toolset官方文档从这里进入
我们以最新版本Red Hat Developer Toolset 12.0为例,可以看到其中包含了很多工具:
简单起见,我们这里直接安装整个工具包, 安装完毕后便可以使用对应的gcc12版本了
yum install devtoolset-12
需要注意的是,如果你直接执行上述命令,很可能会提示找不到仓库。因为想要在RHEL上安装devtoolset,还需要一系列的准备工作。这部分比较繁杂。细节请参考我的另外两篇博文。
准备工作:
-
注册红帽开发者,参考:
Redhat rpm常用命令以及如何配置yum软件仓库使用yum install -
安装devtoolset实现gcc、g++版本切换,请参考:
Redhat7上安装Red Hat Developer Toolset并自由切换gcc和g++的版本
四、验证
假设进行到此处,你的devtoolset已经安装完毕,以安装的devtoolset-12为例,
执行以下命令使得在当前shell上gcc12临时生效
scl enable devtoolset-12 'bash'
或者通过配置环境变量,使得gcc12永久生效
echo "source /opt/rh/devtoolset-12/enable" >>/etc/profile
source /etc/profile
查看当前gcc版本是否为高版本gcc12
gcc --version
gcc版本升级成功后,重新编译即可。
这里还有一点需要注意的是,必须把build目录下的文件清空,然后重新执行cmake生成makefile,否则,还是会使用低版本的gcc。
su - root
cd /opt/googletest/build
rm -rf *
cmake ..
make
make install
至此,问题解决。