Linux---gcc/g++工具

目录

gcc/g++基本了解

基本指令

程序的翻译过程

1、预处理

2、编译

3、汇编

4、链接

动静态库/动静态链接

动态库

静态库

相关指令


gcc/g++基本了解

在Linux中,gcc/g++是用来编译链接形成可执行程序的工具。gcc是C语言的编译器,g++是C++的编译器。

gcc只能编译C,g++即可以编译C还可以编译C++。

基本指令

安装gcc/g++

sudo yum install -y gcc     #安装gcc
sudo yum install -y gcc-c++ #安装g++
gcc 指定.c文件   #编译指定.c文件,形成可执行程序(在当前目录下,默认的可执行程序名为a.out)
g++ 指定.cpp文件 #编译指定.cpp文件,形成可执行程序(在当前目录下,默认的可执行程序名为a.out)
#选项
-o:可指定编译链接之后形成的可执行程序名称,一般后接名称

举个例子

这里使用gcc和g++分别编译链接test.c和test.cpp文件。运行时,执行./可执行文件名 即可。

./c.exe   #执行可执行程序c.exe
./cpp.exe #执行可执行程序cpp.exe

程序的翻译过程

1、预处理

程序在预处理阶段,需要完成头文件展开、去注释、宏替换、条件编译等操作。

-E #文件开始编译链接,完成预处理操作之后就停下来。

举个例子

gcc -E test.c -o test.i #开始编译链接test.c文件,预处理结束之后就停下来。

浅看一下

 main函数之前全是stdio.h的头文件展开和#define的宏替换。可以看出,去注释和条件编译也体现出来了。

-D A=10 #在gcc命令中使用,在编译的时候顺便定义宏
gcc -E test.c -o test.i -D B=10

 浅看一下 

在预处理阶段,程序还是我们能看懂的原语言。

2、编译

编译阶段,程序会被编译成汇编代码。

-S #程序开始编译链接,编译结束后停下来。
gcc -S test.c -o test.s

浅看一下

3、汇编

汇编阶段,程序会被翻译成可重定位目标二进制文件(目标文件)

-c #程序开始编译链接,汇编结束后停下来。
gcc -c test.c -o test.o

浅看一下(由于vim是文本编辑器,所以是以文本的方式打开test.o的,dan实际上test.o是二进制文件,所以这里会出现乱码)

4、链接

在链接阶段,二进制文件要和标准库文件进行链接,最终实现可执行程序文件。

gcc test.c -o c.exe #从test.c文件开始编译链接(从预处理开始),实现可执行程序
gcc test.o -o c.exe #从test.o文件开始编译链接(从链接开始),实现可执行程序

链接被分为静态链接和动态链接,一般gcc/g++都是动态链接。

动静态库/动静态链接

静态链接和动态链接都各自依赖静态库和动态库。

动态库Linux系统本来就有,静态库需要自己安装。

sudo yum install -y glibc-static      #安装C静态库
sudo yum install -y libstdc++-static  #安装C++静态库
ll /lib64/libc.a      #查看C静态库是否存在
ll /lib64/libstdc++.* #查看C++静态库是否存在

能看到这两个文件说明C/C++库已安装。

Linux和Windows中库后缀名

库的后缀名LinuxWindows
动态库.so.dll
静态库.a.lib
ldd 指定可执行程序 #查看指定可执行程序所依赖的库文件

比如说.c/.cpp中使用了printf函数/std::cout函数,这些函数都是在stdio.h/iostream头文件中的。在形成了二进制文件之后,由于在源代码中只是使用了这样的函数,但是没有实现部分,实现部分在stdio.h/iostream头文件中的。动静态库则是打包实现好了这种函数供我们调用。所以程序翻译过程最后一步需要链接,才能得以形成最终的可执行程序文件,这也是动静态库的意义。

使用动态库的这种链接称为动态链接,使用静态库的链接称为静态链接。且动态链接必须使用动态库,静态链接必须使用静态库。

库的本质就是打包实现好了的大家公用的函数,提高开发效率。

库都是二进制文件。

动态库

动态库就是可执行程序通过编译器所获得的公共地址。当程序运行到特定的函数时,程序可以通过这个公共的地址去访问库中对应的方法实现,完成这个调用函数的操作,完成之后回到程序中继续执行接下来的指令。

动态库比较节省资源。大家都从公共的地方去找。但是一旦损坏,就都不能用了。

静态库

静态库就是将特定的函数的实现部分,从库中找到并拷贝到源文件中去。

静态库不依赖库文件,同类型平台都可以直接使用。缺点就是可执行程序的体积比较大。

动态链接是gcc/g++默认的,静态链接需要带上-static选项。

相关指令

-static #使用静态链接
gcc test.c -o c.exe                #动态链接形成可执行程序
gcc test.c -o c_static.exe -static #静态链接形成可执行程序

浅看一下

刚刚程序翻译过程是以C语言举例的,C++也一样,要编译C++程序以及动静态链接形成可执行程序,只需将gcc改为g++即可!

最后,如有不足,请各位大佬指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值