打算从今天开始开一个记录每日学习内容和学习计划的一个专栏,用来督促自己每日有所得不浪费光阴。一开始的记录方式不会太成熟,不过以后会慢慢探索一个比较好的记录方式。此专栏只为自己服务,不对其他人负责。
此致
2020/5/23 研一
Ubuntu 底层库;gcc,g++关系
今天的任务是测试一下师兄给的c语言项目文件,文件是在linux上编写的。本来打算在windows10上直接用visual studio2013运行一下算了,结果发现在linux上编写的程序调用了一些只有linux上才有的库函数,vs上直接运行会报错。无奈只能在虚拟机上通过makefile指令来实现。
第一次使用linux,免不了各种迷茫。首先是对linux操作系统文件存储的不熟悉,然后我对linux上Terminal具体指令也很陌生,只得去百度上各种搜索学习。本来不过是需要运行一个小项目,结果越整越复杂,顿时有种不好的预感。
但接触一个新东西是一个很好的锻炼个人接受能力和训练学习方法的手段,所以对这种东西我也没有太过于排斥。我是在Vmware12安装的Ubuntu12.04 i386,之所以不用最高版本是因为个人认为就算是低版本的软件在开发的时候一般也早已包含了一般用户能使用到的所有功能,如果不是特别对高版本的某些功能有需求,低版本已经足够使用了;此外高版本的软件由于集成了更多功能,因此对普通用户来说显得过于臃肿,拜拜浪费内存和CPU功能去迎合一些完全用不到的功能显得没有必要;最后就我个人经验,如果其他需要兼容的软件版本较低,高版本有可能出现一些兼容性的问题,所以克服自己的一些虚荣心选择一些低版本的软件来安装目前对我是个比较好的选择。
Ubuntu12上已经安装好了gcc编译环境,而且师兄也写好了makefile文件,因此理论上把路径直接通过“cd”命令跳到当前代码所在路径,然后在Terminal使用"make"命令就可以直接生成项目文件了。但是实际操作的时候上来就报了一个错,通过各种百度各种解决问题,发现依然存在显示大意为"libstdc++库缺失"的报错。把这个问题交给师兄解决,然后自己去旁边看别的东西,偶尔看一下他是否处理好了问题,发现一个下午他都在ctrl-c报错的提示然后ctrl-v到百度上搜索具体的解决方法,但是到5点的时候问题依然存在,最后他一摊手把问题还给了我……
回去之后自己百度,总算搞明白了缺失的是什么库。libstdc++库是针对c++语言gcc编译器重写的c++库,所以如果缺失了就根本没法编译c语言的东西,相当于缺失了最基本的连接系统和我的程序的中间层。而造成这个问题的情况并不是ubuntu中没有这个库,只不过是这个库在编译的时候并没有被加上,需要手动添加。
此外,这个库并不是唯一一个用于编译c语言的库,还有其他的版本:
C语言编译:libc, klibc, ulibc三个库已经被glibc库淘汰,glibc的嵌入式版本是eglibc,与这几个库平行的是glib库,它是一个轻量级的c程序库;
C++语言编译:libc++是clang编译器的c++库,libstdc++是gcc编译器的c++库,两个编译器各有特点,不完全相同。
这些库连接了操作系统(ubuntu, windows, etc.)的接口(函数的变量和输出)和你的程序需要调用的库,相当于把c语言转换成二进制机器语言的一个中间人,重要性不言而喻。编译器的作用是把高级语言(.c, .py这种文件)转变为汇编文件(.s这种文件)然后进一步转为(通过as)机器码文件(.o这种文件),最终通过连接器将这个机器码.o文件和库文件(#include中的东西)链接到一起生成可执行文件(.exe文件)。
总结:碰到环境相关的问题不要死扣,先找其他人问,因为环境的问题可能很复杂,但是解释起来很简单。如果其他人也不懂的话再去网上找原理来解决,一味复制粘贴错误命令可以解决问题,但是最终会没有收获,下次依然会出现问题。