编译glog需要各种工具都配套,目前工作环境是:
- centos7.9 :是挺老,但是吧,是目前的工作环境的操作系统,是目标环境
- gcc 6.1.0 : 支持到 c11 和 c++14 ,是目前的工作环境的编译器版本
- glog 0.6.0 : 2022年4月发布的,根据readme里的描述,这个版本使用的C++98标准编写,0.7以上已经使用C++14标准。 (尝试编译了下最新的0.7.1 版本编译器报错,需要gcc 7.4 以上,我这里gcc版本不能动所以,选择了0.6.0版本)
- cmake 3.23 :glog编译要用到它。2022年11月发布的,与上面的glog相匹配。太新的版本会在glog 的 cmake build 时各种报错。(试过3.31及以后的4.1.1 都报错:提示 3.5以前的兼容性已被抛弃)
gcc 6.1.0
准备
安装系统默认的gcc 用于编译 gcc 6.1.0 的代码
$ yum install -y gcc gcc-c++ glibc-headers make wget
#装不上,就查下repo,配置为aliyun的
编译
下载gcc 6.1.0的源码:
$ cd /root/
#下载gcc 6.1.0的源码
$ wget http://mirrors.concertpass.com/gcc/releases/gcc-6.1.0/gcc-6.1.0.tar.gz
$ tar -xzvf gcc-6.1.0.tar.gz
#先装这个download_prerequisites报错无法解压bz2文件
$ yum -y install bzip2
$ cd gcc-6.1.0/
#就是个shell 里面下载了几个文件解压放到源码目录,是基础的几个数学库
$ ./contrib/download_prerequisites
#另外建一个build目录,用来构建的代码
$ cd ../
$ mkdir gcc-6.1.0_build
$ cd gcc-6.1.0_build
$ ../gcc-6.1.0/configure --prefix=/root/gcc-6.1.0_build --enable-checking=release --enable-languages=c,c++ --disable-multilib
$ make -j$(nproc)
$ make install
这里编译的时候,我想到了个有趣的问题,我现在用4.8.5的gcc来编译6.1.0的gcc,觉得很有趣。鸡和蛋的问题又来了。
目前的理解是:(有可能是错的,或者说太浅显,目前没有打算深究)
第一个能够编译的原因,我浅浅的了解到是说,因为gcc本身的代码编写使用的是c98等老的语言标准,所以老的4.8.5可以编译6.1.0版本的gcc。
背后的根本原因是,我所担心的4.8.5对新的编程语言版本的问题,其实是gcc本身的功能 和 构成gcc自身的编写语言,是两个事情。所以这两个看似矛盾的问题,其实是分离的。所以,用老的语言标准实现新的编译器程序。就可以让老的编译器4.8.5,去编译构建新的编译器6.1.0。
遇到的问题小计:
#安装下这个
$ yum -y install bzip2
#不装上面的东西,会在 ./contrib/download_prerequisites 时,报错下载 bz2 类型 文件,无法解压,脚本退出
多版本gcc管理
网上有个scl的方法,还需要把repo相关好好配置下,安装上后,通过devtoolset 进行版本切换,挺方便的,但是最低支持是到 gcc7.x的版本,没有更低的6,好像还是需要折腾下对应的scl repo。没折腾出来,遂放弃。
而且 scl也放弃维护了好像,没找到说具体有什么东西来替代。下面这个update-alternatives 我觉得还算挺方便的,应该就是用这个替代的?
#前面安装了4.8.5,需要重命名 /usr/bin/gcc 和 g++
#不做这个直接 update-alternatives --install 设置会无效
$ cd /usr/bin
$ mv gcc gcc-4
$ mv g++ g++-4
#注册(也就是install)对应的多个版本
#update-alternatives --install <link-path> <name> <file-path> <优先级> --slave <link-path> <name> <file-path>
#--slave 后面是相当于联动,后面切换gcc,g++版本也会跟着变
$ update-alternatives --install /usr/bin/gcc gcc /root/gcc-6.1.0_build/bin/gcc 61 --slave /usr/bin/g++ g++ /root/gcc-6.1.0_build/bin/g++
$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4
#输入对应的数字,选择切换的版本 +号对应的是当前的版本
$ update-alternatives --config gcc
There are 2 programs which provide 'gcc'.
Selection Command
-----------------------------------------------
*+ 1 /root/gcc-6.1.0_build/bin/gcc
2 /usr/bin/gcc-4
Enter to keep the current selection[+], or type selection number:1
#查看对应的版本
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/root/gcc-6.1.0_build/libexec/gcc/x86_64-pc-linux-gnu/6.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-6.1.0/configure --prefix=/root/gcc-6.1.0_build --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 6.1.0 (GCC)
update-alternatives 可以理解为一个基于软连接实现的中转工具。类似接线员一样的方式,将各种文件通过软链接的方式进行版本切换。
无意间了解到 /usr/bin 下的这四个文件
cc : cc 是 gcc 的一个软链接
gcc: c 语言编译器
g++: c++ 语言编译器
c++: c++ 语言编译器
diff c++ 和 g++ 没有发现区别 其实两者是一个东西,ubuntu 下就是一个软连接 简介指向了g++
甚至 ubuntu下就是直接用的 update-alternatives 进行管理的。
cmake 3.23
安装
wget https://cmake.org/files/v3.23/cmake-3.23.0-linux-x86_64.sh
$ chmod +x cmake-3.23.0-linux-x86_64.sh
#两个 y 同意即可,会在同级目录下下载解压一个 “cmake-3.23.0-linux-x86_64” 目录
$ ./cmake-3.23.0-linux-x86_64.sh
#加到path路径下
$ echo 'export PATH="/your/path/to/cmake-3.23.0-linux-x86_64/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
#检查安装
$ cmake -version
cmake version 3.23.0
CMake suite maintained and supported by Kitware (kitware.com/cmake).
其它版本可以在这个版本页面上,按照相同的步骤进行安装:
https://cmake.org/files/
glog 0.6.0
# 下载源码
wget https://github.com/google/glog/archive/refs/tags/v0.6.0.tar.gz
# 解压
tar -xvzf v0.6.0.tar.gz
编译
$ cd glog-0.6.0
#建立两个目录用来编译和安装
$ mkdir build install
#进行cmake生成makefile
#不指定编译器路径的话,cmake还是会自动默认用4.8.5的gcc去编译,然后后面会编译出错,因为glog用到了一些较新的语言标准实现的。
$ cmake -S . -B build -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_C_COMPILER=/etc/alternatives/gcc -DCMAKE_CXX_COMPILER=/etc/alternatives/g++ -G "Unix Makefiles"
#开始build
$ cmake --build build
#install
$ cmake --build build --target install
#查看下 install目录
$ ls install/
include lib64
1038

被折叠的 条评论
为什么被折叠?



