各linux系统gcc g++版本下编译及运行问题记录

各linux系统gcc g++版本下编译及运行问题记录

    • gcc g++多版本共存与切换
    • suse使用
      • zypper软件管理工具
      • rpm安装包
    • shell脚本判断系统类型
      • 返回值和输出内容
      • 判断suse/ubuntu/centos
    • cmake 使用指定版本gcc
      • 查找gcc目录
      • 指定使用gcc目录
    • libc及libstdc++的兼容
      • 查看libc.so.6 libstdc++.so.6的版本
      • 报错libstdc++.so.6: version 'GLIBCXX_3.4.14' not found ... CXXABI 1.3.8
        • 解决
    • 附:linux系统各发行版本出厂时glibc的版本列表

项目在centos下编译的,换到ubuntu中调试,并在suse上发布,遇到的问题做个记录。

gcc g++多版本共存与切换

由于centos中调试太困难,转移到ubuntu中调试,编译时报错cv::imread(std::__cxx11::basic_string centos 7 使用的gcc是4.8.5,ubuntu中的是5.4,在ubuntu中安装4.9版本的gcc g++

// 查看版本
gcc -v
// 查看是否已安装gcc4.9
ls /usr/bin/gcc*
// 安装gcc g++ 4.9
sudo apt-get install gcc-4.9 gcc-4.9-multilib g++-4.9 g++-4.9-multilib
// 输入指令update-alternatives
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 40 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
// 设置使用的版本
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
// 输入命令后输入选择的版本,设置完毕后,gcc -v看是否成功
// 如果要删除可选项
sudo update-alternatives --remove gcc /usr/bin/gcc-4.9

suse使用

zypper软件管理工具

搜索软件
zypper search package
安装软件
zypper install package
安装某个版本的软件包
zypper install package=version
安装以某个单词名字开头的所有软件包
zypper install package*
卸载某个软件包
zypper remove package
升级某个软件包
zypper update package
获取所有可用新包的列表
zypper list-updates
检验软件包的依赖关系的完整性
zypper verify package
执行系统升级
zypper dist-upgrade
执行源代码软件安装和其依赖
zypper source-install package.tgz

rpm安装包

使用zypper安装cmake,报错Failed to mount cd:///?devices=/dev/disk/by-id/ata-VMware_Virtual_IDE…,可能是要插入安装盘,于是直接找suse的安装包rpm文件安装(redhat的安装包rpm,对应debian的deb):
https://pkgs.org/download/cmake
安装cmake 3.5编译成功,centos上是2.8.12,在这里cmake版本没有影响。

shell脚本判断系统类型

返回值和输出内容

shell中定义了一个特殊的变量“?”用来保存上一个命令结束后的返回值。
echo $?
在shell中,$?是返回值
可以直接赋给变量:
RC=$?
$?只是上一个命令的返回状态,比如成功返回0,失败返回-1。不会保存ps -ef|grep vim的输出内容.
将输出内容保存到变量中:

# 返回值
echo $?
# 保存ps -ef|grep vim的输出内容
res=`ps -ef|grep vim`

判断suse/ubuntu/centos

#!/bin/bash
SUSE=`cat /proc/version |grep SUSE`
UBUNTU=`cat /proc/version |grep Ubuntu`
CENTOS=`cat /proc/version |grep centos`
echo $SUSE
if [[ $SUSE && ! $UBUNTU && ! $CENTOS ]];
then
	echo "is suse"
	echo "do sth"
elif [[ ! $$SUSE && $UBUNTU && ! $CENTOS ]];
then
	echo "is ubuntu"
	echo "do sth"
elif [[ ! $$SUSE && ! $UBUNTU && $CENTOS ]];
then
	echo "is centos"
	echo "do sth"
else
	echo "err"
fi

cmake 使用指定版本gcc

cmake时发现,默认使用的gcc低版本,不支持c++11。

查找gcc目录

gcc --version :查看当前使用的gcc版本
which gcc:查看gcc运行路径
whereis gcc:查看gcc安装路径

指定使用gcc目录

cmake前,输出环境变量CC (and CXX),指定gcc执行文件位置:
export CC=/…your path…/bin/gcc
export CXX=/…your path…/bin/g++

libc及libstdc++的兼容

查看libc.so.6 libstdc++.so.6的版本

找到使用的libc.so.6(libstdc++.so.6),直接./libc.so.6运行。
或者使用ldd --version。ldd应该是由libc.so.6提供。

报错libstdc++.so.6: version ‘GLIBCXX_3.4.14’ not found … CXXABI 1.3.8

在使用gcc 4.9.4编译程序成功后,运行报这个错。
运行前,设置了LD_LIBRARY_PATH环境变量,使用的程序目录下的libc.so.6 libstdc++.so.6。

解决

通过strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
看到目录下的 libstdc++.so.6没有CXXABI 1.3.8。应该是gcc链接到了其他的库中。
然后通过locate libstdc++.so.6
找到使用的gcc 4.9.4版本的libstdc++.so.6.0.20(或者任意高版本?)
再使用strings发现libstdc++.so.6.0.20中有CXXABI 1.3.8。
然后删除设置的LD_LIBRARY_PATH对应目录中的libstdc++.so.6,复制libstdc++.so.6.0.20到此目录下,创建libstdc++.so.6.0.20到libstdc++.so.6的软连接:sodu ln -sf libstdc++.so.6.0.20 libstdc++.so.6
再运行程序,便不会报这个错了。需注意ln命令似乎只能在linux文件系统中使用,mount的windows共享文件夹中用会报错,要复制到linux中使用。

附:linux系统各发行版本出厂时glibc的版本列表

在低版本的glibc系统中编译,高版本中运行,会避免一些版本兼容的问题。
以下转自:https://blog.csdn.net/Lovegengxin/article/details/81909056

  1. CentOS系列
    centos4.0-32bit : ldd (GNU libc) 2.3.4
    centos5.0-32bit : ldd (GNU libc) 2.5
    centos6.0-32bit :
    centos6.5-32bit :
    centos7.0-32bit :
    centos7.2-32bit :
    centos3.1-64bit : ldd (GNU libc) 2.3.2
    centos3.3-64bit : ldd (GNU libc) 2.3.2
    centos4.0-64bit : ldd (GNU libc) 2.3.4
    centos5.0-64bit : ldd (GNU libc) 2.5
    centos6.0-64bit : ldd (GNU libc) 2.12
    centos6.5-64bit : ldd (GNU libc) 2.12
    centos7.0-64bit : ldd (GNU libc) 2.17
    centos7.2-64bit :
    centos7.4-64bit : ldd (GNU libc) 2.17
  2. Redhat系列
    redhat6.5-64bit : ldd (GNU libc) 2.12
    redhat7.0-64bit : ldd (GNU libc) 2.17
    redhat7.3-64bit : ldd (GNU libc) 2.17
  3. Debian系列
    debian6.0-32bit : ldd (Debian EGLIBC 2.11.3-4) 2.11.3
    debian7.0-32bit : ldd (Debian EGLIBC 2.13-38+deb7u12) 2.13
    debian7.0-64bit : ldd (Debian EGLIBC 2.13-38+deb7u12) 2.13
  4. SuSe系列
    suse9.0-32bit : ldd (GNU libc) 2.3.5
    suse9.1-64bit : ldd (GNU libc) 2.3.3
    suse10.0-32bit : ldd (GNU libc) 2.4
    suse10.0-64bit : ldd (GNU libc) 2.3.5
    suse11.0-64bit : ldd (GNU libc) 2.11.1
    suse12.0-64bit : ldd (GNU libc) 2.19
    opensuse42-64bit : ldd (GNU libc) 2.19
  5. Fedora系列
    fedora22-64bit : ldd (GNU libc) 2.22
    fedora23-64bit :
  6. Ubuntu系列
    ubuntu12-64bit : ldd (Ubuntu EGLIBC 2.15-0ubuntu10.6) 2.15
    ubuntu14-64bit : ldd (Ubuntu EGLIBC 2.19-0ubuntu6.9) 2.19
  7. FreeBSD系列
    freebsd11-64bit :
  8. Asianux系列
    Asianux Server 3-64bit : ldd (GNU libc) 2.5
  9. PowerLinux系列
    powerlinux6.5-64bit: ldd (GNU libc) 2.12
    powerlinux7.3-64bit: ldd (GNU libc) 2.17

你可能感兴趣的:(C++,系统设置,linux)