IT技术之家

首页 > 编程

编程

gcc的学习及 版本太低如何在conda环境下重新进行安装_weixin_44719529_conda 安装gcc

发布时间:2022-10-24 17:50:06 编程 0次 标签:学习 conda linux
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 报错...

文章目录

前言一、gcc是什么?1、gcc的基本概念--将人能看懂的话(代码)变成机器能看懂的话2、gcc 链接库 二、报错:/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 及分析和解决方法0. 什么是GLIBC?1、分析问题:2、 解决问题: 总结


前言

本文主要是在学习linux过程中,小白的进阶过程,中间学习到的内容进行以下总结
—`

一、gcc是什么?

1、gcc的基本概念–将人能看懂的话(代码)变成机器能看懂的话

链接: 参考链接,下面进行简要摘抄
大白话的讲,就是负责“翻译”或“解释”代码的一个软件!

比如C语言、C++、Java这样的程序,当我们一行一行写下代码后,需要经过编译器的“翻译”才能变成可执行程序才可以执行。才可以实现代码到程序的转变,而这一切都需要编译器帮我们去做。
那么问题来了,我们学编程,比如C语言,又是32个关键字、又是各种函数,还有各种语法,学这些不就为了写代码让电脑执行吗?为什么还要编译器“翻译”呢? 答案很简单,因为:电脑(其实主要就是CPU)只认识0或1这两个数字。所有写的一切代码,都需要编译器帮我们编译也就是翻译成大量的01代码,才是CPU的“母语”,CPU才会熟练的帮我们飞一般的帮速度执行
那么你可能又会问,既然CPU只认识0和1,反正也要翻译一遍,那我们还学什么编程,学什么语法,直接用汉语写命令写代码不行吗?答案是:当然可以,比如易语言,或号称一句话就可以完成一个功能的swift语言等等。无论哪种语言,想要最终成为可执行的程序,都需要编译器帮我们去编译才可以实现! 无非是语言的高级与否,影响编译器翻译量多少而已!
以C语言为例,常见的编译器有:

Windows系统下VC/VS系列编译器为cl.exe

Linux系统下原生自带的gcc编译器

Max系统下的LLVM/CLANG编译器

这些编译器的使用方式常常在DOS或命令提示符下,通过一步步的命令进行操作,需要经过编译、链接才会生成对应的可执行文件

2、gcc 链接库

链接: 参考原文
链接: [参考引文](https://www.cnblogs.com/qqcwannagraduate/p/4641067.html)

https://www.cnblogs.com/panfeng412/archive/2011/10/20/library_path-and-ld_library_path.html
)

二、报错:/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20’ not found 及分析和解决方法

0. 什么是GLIBC?

Linux系统glibc和 GLIBCXX库版本信息查看
理清gcc、glibc、libstdc++的关系

glibc是gnu发布的libc库,也即c运行库。glibc是linux 系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本 身也提供了许多其它一些必要功能服务的实现,

1、分析问题:

[xxx@xxxx]$ strings /usr/lib64/libstdc++.so.6 |grep GLIBCX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

分析结果,发现确实没有GLIBCXX_3.4.20 和GLIBCXX_3.4.21;因为该计算节点环境下链接的动态库版本太低;
之前在linux的登陆节点上进行测试发现存在,20和21 ,只能说链接的库存在问题
问题是,在计算节点 不能使用系统的gcc,所以只能在conda下重新安装gcc,之后进行运行程序利用该env下的gcc

[xxx@ln01 ~]$ strings /usr/lib64/libstdc++.so.6 |grep GLIBCX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_DEBUG_MESSAGE_LENGTH

2、 解决问题:

1、创建conda虚拟环境(已有的话,直接激活/切换即可)
conda create -n gcc_test
2、激活conda 虚拟环境
conda activate gcc_test
3、安装gcc
conda install -c conda-forge gcc(全部yes)
4、查看gcc版本
gcc --version
(gcc_test) [xxxx@cu01 bin]$ gcc --version
gcc (conda-forge gcc 12.1.0-16) 12.1.0
Copyright (C) 2022 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_test) [xxxx@cu01 bin]$ which gcc
#显示gcc 在env /deepfoldrna/bin中,所以链接的库应该在bin的同一目录下,及lib文件夹下
~/DeepFoldRNA/conda_local/conda/envs/deepfoldrna/bin/gcc
5、查看lib下的动态链接库
(gcc_test) [xxxx@cu01 lib的上一层目录]$ strings lib/libstdc++.so.6 |grep GLIBCX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH
_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4
_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEv@@GLIBCXX_3.4.5
_ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw@GLIBCXX_3.4
_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4.5

6、可以发现存在版本20和21 ,目前就是执行程序的时候使使用环境中gcc,而非系统的gcc
===发现其实在gcc_test的环境下查看gcc是新下载的gcc
查看环境变量也可以发现环境变量存在(gcc_test) [xxxx@cu01 DeepFoldRNA]$ echo $PATH
/home/xxxxx/xxxx/conda_local/conda/envs/deepfoldrna/bin:..........
6.2补充环境变量
/home/xxxxxxx/conda_local/conda/envs/xxxx/bin:/home/xxxx/xxxx/conda_local/conda/envs/xxxx/lib:
增加了gcc二进制文件的环境变量和lib文件的环境变量,但是还是报错,之后也没有删除,具体探索也不探索了,感觉问题不是关键,但加上也没有错误
7、如果还找不到链接库的版本只能是动态链接库链接存在问题:即gcc没有问题,但是不要让他去找原有的链接库


8 设置动态链接库的环境变量

###临时起作用,程序加载过程中首先进行查询,加载完毕就没有了,echo发现原来设置的不存在
export LD_LIBRARY_PATH=/home/xxxx/xxxxx/conda_local/conda/envs/xxxxxx/lib/:$LD_LIBRARY_PATH

为了解决这个问题
在.bashrc文件中,加入下面语句,并source .bashrc。
也可以临时export
为解决这个问题,参考了以下博客,表示感谢:

https://www.cnblogs.com/chenwenyan/p/13510173.html
==成功了=

总结

1、虚拟环境就是类似一个桃花岛,与世无争,与外界互不干扰
2、虚拟环境下安装gcc后,需要进行环境变量的设置~/bin/:~/lib/(非关键)
3、环境变量的设置:
export PATH=/usr/local/nginx/sbin/:$PATH,将/usr/local/nginx/sbin/目录临时添加到环境变量中–添加在已有的环境变量的前面
export PATH=$PATH:/usr/local/nginx/sbin/,将/usr/local/nginx/sbin/目录临时添加到环境变量中–添加在已有的环境变量的后边
4、动态链接库的设置
5、hpc其实是多个计算节点的集群,可以ssh具体的节点进行运行程序,也可以利用pbs进行交互式运行(随机分配到具体的节点而已);利用pbs的时候可以先source激活虚拟环境,之后增加环境变量(顺序改变没试过)之后正常调用程序即可