【Linux学习】gcc与g++的使用与程序翻译的过程


这里补充一个前面遗漏的知识:

修改sudo用户名单

  • 必须使用root超级用户进行修改,普通用户是不能访问修改。
  1. 输入指令打开相应的文件
# vim /etc/sudoers
  1. root 用户:
    在这里插入图片描述

  2. 在的对应位置修改,只需要将root那一行复制,然后粘贴在下面,将用户名修改成对应的即可。

  3. 其中,注意,退出的时候需要强制退出。切换成底行模式,输入wq!即可。


gcc与g++指令

g++与gcc的安装指令:

# yum install gcc
# yum install g++

其中,gcc与g++用法一样

gcc用法

注意:gcc只能编译C语言

用法一:执行后会默认在该目录下形成一个 a.out 的文件

# gcc + 文件名      

用法二:不想要默认的文件名,可以加选项 -o ,-o后面+生成指定文件
两种写法都可以:

# gcc -o 文件名M .c文件     //编译该.c文件,生成一个名为M的可执行文件
# gcc .c文件 -o 文件名M      //编译该.c文件,生成一个名为M的可执行文件
g++用法

注意:g++既可以编译C++,也可以编译C语言

用法一:执行后会默认在该目录下形成一个 a.out 的文件

# g++ + 文件名      

用法二:不想要默认的文件名,可以加选项 -o ,-o后面+生成指定文件
两种写法都可以:

# g++ -o 文件名M .c文件     //编译该.c文件,生成一个名为M的可执行文件
# g++ .c文件 -o 文件名M      //编译该.c文件,生成一个名为M的可执行文件

程序翻译的过程

扩展知识:语言的发展:二进制语言----->汇编语言----->C语言----->C++,java,shell等语言

问题:
先有语言还是先有该语言对应的编译器呢?先有汇编语言呢还是先有用汇编语言写的编译器呢?

假设现在有汇编语言,那么肯定是先有用二进制语言所写的能够编译汇编语言的编译器,该编译器能够把汇编语言翻译成二进制,才有的汇编语言。同样,第一个把c语言编译器,肯定是利用汇编语言所写能够让C语言变为汇编语言的编译器。这是语言和编译器的自举的过程。

程序翻译的过程,就是从其他语言翻译为计算机能够识别二进制语言的过程,和上面的语言发展方向相反。

以C语言为例:

一.预处理

主要工作:
a,头文件的展开:将头文件部分内容拷贝到源文件,有对应的拷贝条件
b,宏替换
c,去注释
d,条件编译

条件编译的用途:实现代码裁剪等等。

注意:经过了预处理,语言种类没有改变,例如:C语言预处理后,还是C语言

翻译时,预处理完成后停止:

方法一:
会将结果打印到显示屏上

# gcc -E 目标文件    
//-E::翻译的时候,在预处理完成后就停止

方法二:
将执行后的结果形成一个临时文件

# gcc -E 目标文件 -o XXX.i 文件

在这里插入图片描述
二.编译(生成汇编)

主要的工作
把其他语言 转为 汇编语言(如图)
在这里插入图片描述

翻译时,编译完成后停止:
方法:
将执行后的结果形成一个临时文件

# gcc -S 目标文件/预处理后生成的.i文件 -o XXX.s 文件

在这里插入图片描述

三.汇编(生成机器可识别代码)

主要工作:
汇编---->二进制(可重定位目标二进制文件) 注意:该文件是不能够执行的。
把其他语言 转为 汇编语言

翻译时,汇编完成后停止:
方法一:

# gcc -c 目标文件   //不指定,编译器会默认生成一个同名.o文件
//-c::翻译的时候,在汇编完成后就停止

方法二:指定文件

# gcc -c 目标文件 -o XXX.o的文件

在这里插入图片描述

四.链接(生成可执行文件或库文件)

主要工作:
将我们的可执行程序,与系统中的库建立联系。

例如:
我们所写的程序中,使用了库里面函数,并没有自己实现,这时就需要和库里面的函数建立联系;

命令:

# gcc -o code test.o   //不需要带选项,直接生成可执行程序code(可以自己命名)

在这里插入图片描述

函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

动态库与静态库

库分为动态库与静态库,在linux中,动态库文件以.so结尾, 静态库以.a结尾。在windows中,动态库文件以.dll结尾, 静态库以.lib结尾。
库本质就是一个文件,里面包含了很多已经被编译好的代码。

什么是动静态库?

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。

动静态库的优缺点

动态库(链接方式:动态链接)
优点:比较节省资源,不会出现太多的重复代码 资源:磁盘,内存,网络等资源(例如:写了一个项目,里面有多个文件,这里文件中调用了很多个库里面的函数,虽然调用了很多函数,但是实现就只有一个,不会造成代码冗余的问题)
缺点:对库的依赖性强,一旦库出现问题,那么所有使用了该库的程序全部都无法运行。

静态库(链接方式:静态链接)
优点:不依赖库(因为静态链接是拷贝),可以在同类型平台中都直接运行。
缺点:体积比较大,比较浪费资源,会出现太多的重复代码 资源:磁盘,内存,网络等资源。

例子:
动态链接(编译器默认)
在这里插入图片描述
当我们改为静态链接时:

静态库的查看指令:

# ls /lib64/libc.a

C/C++静态库的安装:命令

# sudo yum install glibc-static libstdc++-static

在这里插入图片描述

Linux系统支持开发,因为提前在系统中安装了语言的标准头文件与库文件。
例如:
在Linux中,/libc.so.6为C语言标准库。

ldd指令

功能:可以查看一个可执行程序所依赖的库文件

用法:

# ldd 文件

示例:
在这里插入图片描述


  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值