当前位置:   article > 正文

CentOS 7 升级gcc/g++ 至7.3、8.3、9.3_centos g++升级

centos g++升级

功能需求:CentOS 7 编译安装spdlog-1.12.0 提示如下错误信息:

  1. [root@localhost build]# cmake .. && make -j
  2. -- Build spdlog: 1.12.0
  3. -- Build type: Release
  4. -- Generating example(s)
  5. -- Generating install
  6. -- Configuring done
  7. -- Generating done
  8. -- Build files have been written to: /usr/local/source_code/spdlog-1.12.0/build
  9. Consolidate compiler generated dependencies of target spdlog
  10. [ 80%] Built target spdlog
  11. [ 90%] Building CXX object example/CMakeFiles/example.dir/example.cpp.o
  12. In file included from /usr/local/source_code/spdlog-1.12.0/example/example.cpp:135:0:
  13. /usr/local/source_code/spdlog-1.12.0/include/spdlog/sinks/daily_file_sink.h: 在静态成员函数‘static spdlog::filename_t spdlog::sinks::daily_filename_format_calculator::calc_filename(const filename_t&, const tm&)’中:
  14. /usr/local/source_code/spdlog-1.12.0/include/spdlog/sinks/daily_file_sink.h:57:19: 错误:‘put_time’不是‘std’的成员
  15. stream << std::put_time(&now_tm, file_path.c_str());
  16. ^
  17. /usr/local/source_code/spdlog-1.12.0/example/example.cpp: 在全局域:
  18. /usr/local/source_code/spdlog-1.12.0/example/example.cpp:285:13: 错误:在不同命名空间内对‘template<class T, class Char, class Enable> struct fmt::v9::formatter’的特例化 [-fpermissive]
  19. struct fmt::formatter<my_type> : fmt::formatter<std::string>
  20. ^
  21. In file included from /usr/local/source_code/spdlog-1.12.0/include/spdlog/fmt/fmt.h:27:0,
  22. from /usr/local/source_code/spdlog-1.12.0/include/spdlog/common.h:50,
  23. from /usr/local/source_code/spdlog-1.12.0/include/spdlog/spdlog.h:12,
  24. from /usr/local/source_code/spdlog-1.12.0/example/example.cpp:30:
  25. /usr/local/source_code/spdlog-1.12.0/include/spdlog/fmt/bundled/core.h:791:8: 错误: 从‘template<class T, class Char, class Enable> struct fmt::v9::formatter’的定义 [-fpermissive]
  26. struct formatter {

查看CentOS 7 gcc/g++ 版本信息:

  1. [root@localhost build]# g++ --version
  2. g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
  3. Copyright © 2015 Free Software Foundation, Inc.
  4. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
  5. 包括没有适销性和某一专用目的下的适用性担保。

解决办法:升级CentOS 7 gcc/g++ 版本信息。 

GCC版本对C++的支持情况

Cent OS 7 将gcc/g++ 升级为8.3 版本

核心指令代码:

  1. yum -y install centos-release-scl
  2. yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils
  3. scl enable devtoolset-8 bash
  4. 需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
  5. 如果要长期使用gcc 8.3的话:
  6. echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile

安装详情

  1. [root@localhost build]# gcc --version
  2. gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
  3. Copyright © 2015 Free Software Foundation, Inc.
  4. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
  5. 包括没有适销性和某一专用目的下的适用性担保。
  6. [root@localhost build]# g++ --version
  7. g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
  8. Copyright © 2015 Free Software Foundation, Inc.
  9. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
  10. 包括没有适销性和某一专用目的下的适用性担保。
  11. [root@localhost build]# yum install centos-release-scl-rh
  12. 已加载插件:fastestmirror
  13. Determining fastest mirrors
  14. * base: mirrors.163.com
  15. * extras: mirrors.163.com
  16. * updates: mirrors.163.com
  17. base | 3.6 kB 00:00:00
  18. docker-ce-stable | 3.5 kB 00:00:00
  19. extras | 2.9 kB 00:00:00
  20. updates | 2.9 kB 00:00:00
  21. (1/2): docker-ce-stable/7/x86_64/primary_db | 118 kB 00:00:28
  22. (2/2): updates/7/x86_64/primary_db | 24 MB 00:03:19
  23. 正在解决依赖关系
  24. --> 正在检查事务
  25. ---> 软件包 centos-release-scl-rh.noarch.0.2-3.el7.centos 将被 安装
  26. --> 解决依赖关系完成
  27. *******
  28. [root@localhost build]# yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils
  29. 已加载插件:fastestmirror
  30. Loading mirror speeds from cached hostfile
  31. * base: mirrors.163.com
  32. * centos-sclo-rh: mirrors.163.com
  33. * extras: mirrors.163.com
  34. * updates: mirrors.163.com
  35. centos-sclo-rh | 3.0 kB 00:00:00
  36. centos-sclo-rh/x86_64/primary_db | 3.4 MB 00:00:53
  37. 正在解决依赖关系
  38. --> 正在检查事务
  39. ---> 软件包 devtoolset-8-binutils.x86_64.0.2.30-55.el7.2 将被 安装
  40. --> 正在处理依赖关系 devtoolset-8-runtime,它被软件包 devtoolset-8-binutils-2.30-55.el7.2.x86_64 需要
  41. ---> 软件包 devtoolset-8-gcc.x86_64.0.8.3.1-3.2.el7 将被 安装
  42. ---> 软件包 devtoolset-8-gcc-c++.x86_64.0.8.3.1-3.2.el7 将被 安装
  43. --> 正在处理依赖关系 devtoolset-8-libstdc++-devel = 8.3.1-3.2.el7,它被软件包 devtoolset-8-gcc-c++-8.3.1-3.2.el7.x86_64 需要
  44. --> 正在检查事务
  45. ---> 软件包 devtoolset-8-libstdc++-devel.x86_64.0.8.3.1-3.2.el7 将被 安装
  46. ---> 软件包 devtoolset-8-runtime.x86_64.0.8.1-1.el7 将被 安装
  47. --> 正在处理依赖关系 scl-utils >= 20120927-11,它被软件包 devtoolset-8-runtime-8.1-1.el7.x86_64 需要
  48. --> 正在检查事务
  49. ---> 软件包 scl-utils.x86_64.0.20130529-19.el7 将被 安装
  50. --> 解决依赖关系完成
  51. ******
  52. [root@localhost build]# scl enable devtoolset-8 bash
  53. [root@localhost build]# echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile
  54. [root@localhost build]# gcc --version
  55. gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
  56. Copyright (C) 2018 Free Software Foundation, Inc.
  57. This is free software; see the source for copying conditions. There is NO
  58. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  59. [root@localhost build]# g++ --version
  60. g++ (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
  61. Copyright (C) 2018 Free Software Foundation, Inc.
  62. This is free software; see the source for copying conditions. There is NO
  63. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  64. ******

验证C++ 标准函数库std::put_time函数能否正常使用 

前提条件:切换至 /usr/local/source_code/c_demo 目录并创建hello_putTiem.cpp 文件,编辑内容如下:

  1. #include <iostream>
  2. #include "sstream"
  3. #include "ctime"
  4. #include "iomanip"
  5. void currTime_()
  6. {
  7. auto t=time(nullptr);
  8. auto tm=*localtime(&t);
  9. std::ostringstream oss;
  10. oss<<std::put_time(&tm,"%d.%m.%Y %H:%M:%S:");
  11. std::cout<<oss.str()<<std::endl;
  12. }
  13. int main() {
  14. currTime_();
  15. std::cout << "Hello, World!" << std::endl;
  16. return 0;
  17. }

编译并执行:

  1. [root@localhost c_demo]# g++ hello_putTiem.cpp -o hello_putTiem
  2. [root@localhost c_demo]# ll
  3. 总用量 36
  4. -rwxr-xr-x. 1 root root 8480 918 17:32 hello_gtk
  5. -rw-r--r--. 1 root root 246 918 17:32 hello_gtk.c
  6. -rwxr-xr-x. 1 root root 15936 1122 15:17 hello_putTiem
  7. -rw-r--r--. 1 root root 361 1122 15:16 hello_putTiem.cpp
  8. [root@localhost c_demo]# ./hello_putTiem
  9. 22.11.2023 15:17:16:
  10. Hello, World!

结论:gcc/g++ 版本升级成功并且支持std:put_time 函数。

再次编译Spdlog-1.12.0

切换至spdlog-1.12.0/build 目录执行如下命令:

  1. [root@localhost spdlog-1.12.0]# cd build/
  2. [root@localhost build]# cmake .. && make -j
  3. -- Build spdlog: 1.12.0
  4. -- Build type: Release
  5. -- Generating example(s)
  6. -- Generating install
  7. -- Configuring done
  8. -- Generating done
  9. -- Build files have been written to: /usr/local/source_code/spdlog-1.12.0/build
  10. Consolidate compiler generated dependencies of target spdlog
  11. [ 80%] Built target spdlog
  12. [ 90%] Building CXX object example/CMakeFiles/example.dir/example.cpp.o
  13. In file included from /usr/local/source_code/spdlog-1.12.0/example/example.cpp:135:0:
  14. /usr/local/source_code/spdlog-1.12.0/include/spdlog/sinks/daily_file_sink.h: 在静态成员函数‘static spdlog::filename_t spdlog::sinks::daily_filename_format_calculator::calc_filename(const filename_t&, const tm&)’中:
  15. /usr/local/source_code/spdlog-1.12.0/include/spdlog/sinks/daily_file_sink.h:57:19: 错误:‘put_time’不是‘std’的成员
  16. stream << std::put_time(&now_tm, file_path.c_str());
  17. ^
  18. /usr/local/source_code/spdlog-1.12.0/example/example.cpp: 在全局域:
  19. /usr/local/source_code/spdlog-1.12.0/example/example.cpp:285:13: 错误:在不同命名空间内对‘template<class T, class Char, class Enable> struct fmt::v9::formatter’的特例化 [-fpermissive]
  20. struct fmt::formatter<my_type> : fmt::formatter<std::string>
  21. ^
  22. In file included from /usr/local/source_code/spdlog-1.12.0/include/spdlog/fmt/fmt.h:27:0,
  23. from /usr/local/source_code/spdlog-1.12.0/include/spdlog/common.h:50,
  24. from /usr/local/source_code/spdlog-1.12.0/include/spdlog/spdlog.h:12,
  25. from /usr/local/source_code/spdlog-1.12.0/example/example.cpp:30:
  26. /usr/local/source_code/spdlog-1.12.0/include/spdlog/fmt/bundled/core.h:791:8: 错误: 从‘template<class T, class Char, class Enable> struct fmt::v9::formatter’的定义 [-fpermissive]
  27. struct formatter {
  28. ^
  29. make[2]: *** [example/CMakeFiles/example.dir/example.cpp.o] 错误 1
  30. make[1]: *** [example/CMakeFiles/example.dir/all] 错误 2
  31. make: *** [all] 错误 2

哎,无语了还是无法正常编译,突然想起spdlog 日志开源项目是基于CMake 进行的项目构建,检查一下CMakeLists.txt文件,目录地址:/usr/local/source_code/spdlog-1.12.0/CMakeLists.txt

我这里重点讲解spdlog 编译依赖的cmake 版本信息和g++ 版本信息。

cmake 版本要求:3.10 -3.21 版本
cmake_minimum_required(VERSION 3.10...3.21)

g++  版本信息:

  1. # ---------------------------------------------------------------------------------------
  2. # Compiler config
  3. # ---------------------------------------------------------------------------------------
  4. if(SPDLOG_USE_STD_FORMAT)
  5. set(CMAKE_CXX_STANDARD 11) // 默认编译版本是20, 我这里将其修改为11
  6. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  7. elseif(NOT CMAKE_CXX_STANDARD)
  8. set(CMAKE_CXX_STANDARD 11)
  9. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  10. endif()

 再次编译,还是相同的问题。

更多关于spdlog 关于CMake配置请参考:spdlog CMake 构建项目 

spdlog 安装之柳暗花明

通过百度/谷歌,发现其他的C/C++ 开发者是直接引用源码方式。

核心步骤:

1.下载spdlog源码到任意目录下, 我的存放目录地址:/usr/local/source_code/spdlog-1.12.0
2.将spdlog源码的include中的spdlog文件夹整个复制到/usr/include/目录下,即/usr/include/spdlog,这样可以在调用的时候可以找到头文件spdlog相关的内容。

执行如下指令:

[root@localhost include]# cp -r /usr/local/source_code/spdlog-1.12.0/include/spdlog /usr/include/spdlog

3.验证spdlog 日志框架

切换至/usr/local/source_code/spdlog_demo  目录,并创建test_spdlog.cpp文件,文件内容如下:

  1. [root@localhost spdlog_demo]# cat test_spdlog.cpp
  2. //helloSpdlog.cc
  3. #include "spdlog/spdlog.h"
  4. int main()
  5. {
  6. spdlog::info("Welcome to spdlog!");
  7. spdlog::error("Some error message with arg: {}", 1);
  8. spdlog::warn("Easy padding in numbers like {:08d}", 12);
  9. spdlog::critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
  10. spdlog::info("Support for floats {:03.2f}", 1.23456);
  11. spdlog::info("Positional args are {1} {0}..", "too", "supported");
  12. spdlog::info("{:<30}", "left aligned");
  13. spdlog::set_level(spdlog::level::debug); // Set global log level to debug
  14. spdlog::debug("This message should be displayed..");
  15. // change log pattern
  16. spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
  17. // Compile time log levels
  18. // define SPDLOG_ACTIVE_LEVEL to desired level
  19. SPDLOG_TRACE("Some trace message with param {}", 42);
  20. SPDLOG_DEBUG("Some debug message");
  21. }

编译并执行:

  1. [root@localhost spdlog_demo]# g++ test_spdlog.cpp -o test_spdlog -std=c++11
  2. [root@localhost spdlog_demo]# ll
  3. 总用量 1688
  4. -rwxr-xr-x. 1 root root 1720472 1122 16:13 test_spdlog
  5. -rw-r--r--. 1 root root 925 1122 15:57 test_spdlog.cpp
  6. [root@localhost spdlog_demo]# ./test_spdlog
  7. [2023-11-22 16:13:45.822] [info] Welcome to spdlog!
  8. [2023-11-22 16:13:45.822] [error] Some error message with arg: 1
  9. [2023-11-22 16:13:45.822] [warning] Easy padding in numbers like 00000012
  10. [2023-11-22 16:13:45.822] [critical] Support for int: 42; hex: 2a; oct: 52; bin: 101010
  11. [2023-11-22 16:13:45.822] [info] Support for floats 1.23
  12. [2023-11-22 16:13:45.822] [info] Positional args are supported too..
  13. [2023-11-22 16:13:45.823] [info] left aligned
  14. [2023-11-22 16:13:45.823] [debug] This message should be displayed..

Cent OS 7 将gcc/g++ 升级为7.3\8.3\9.3 版本核心指令

升级到gcc/g++ 7.3:

yum -y install centos-release-scl
yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
scl enable devtoolset-7 bash

需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 7.3的话:

echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile

 升级到gcc/g++ 8.3:

yum -y install centos-release-scl
yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils
scl enable devtoolset-8 bash

需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 8.3的话:

echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile

 升级到gcc/g++ 9.3:

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash

需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 9.3的话:

echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/940367
推荐阅读
相关标签
  

闽ICP备14008679号