编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’

编译gtest报错‘is_trivially_copy_constructible’ is not a member of ‘std’

一、问题描述

在一个新的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

20221225212542

查看本机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官方文档从这里进入

20221225213728

我们以最新版本Red Hat Developer Toolset 12.0为例,可以看到其中包含了很多工具:
20221225214048

简单起见,我们这里直接安装整个工具包, 安装完毕后便可以使用对应的gcc12版本了

yum install devtoolset-12

需要注意的是,如果你直接执行上述命令,很可能会提示找不到仓库。因为想要在RHEL上安装devtoolset,还需要一系列的准备工作。这部分比较繁杂。细节请参考我的另外两篇博文。

准备工作:

四、验证

假设进行到此处,你的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

至此,问题解决。

20221226015751

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smart_cat

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值