linux之gcc/g++编译器与linux项目自动化构建工具(make/makefile)

一、gcc/g++编译器

在Linux系统上编译一个C语言文件的步骤通常包括以下几个步骤:

编写C源代码文件:首先,你需要使用文本编辑器(如vi、nano等)编写C语言源代码文件,并将其保存为.c文件扩展名,比如hello.c。

打开终端:在Linux系统上,打开终端或命令行界面。

进入源代码文件所在目录:使用cd命令进入存放C源代码文件的目录,例如:cd /path/to/source_code_directory。

编译源代码:使用C编译器(一般是gcc)对源代码进行编译,生成可执行文件。在终端中输入以下命令:gcc -o executable_name source_file.c。其中,executable_name是你想要生成的可执行文件的名称,source_file.c是你的C源代码文件的名称。

例如:gcc -o hello hello.c。

执行可执行文件:编译成功后,在终端中运行可执行文件。输入./executable_name执行可执行文件。

例如:./hello。

注意:在编译过程中,可能需要链接一些库文件,需要添加-l参数来指定所需的库文件。还可以通过其他参数来控制编译过程,如优化选项等。

1.程序的翻译过程

一个程序的翻译过程可以分为四步:预处理、编译、汇编、链接阶段
(1)预处理
在预处理中,程序会执行“头文件展开、去注释、宏替换、条件编译”等工作,为了更加直观的显示,假设我们现在有test.c文件,里面包含下图的程序:
(2)编译
编译简单来讲,就是将预处理过后的“纯C语言”转化成汇编语言。此时我们输入“gcc -S test.c -o test.s”命令,该命令会在文件执行完汇编后结束并将结果放入test.s文件:
(3)汇编
对于这一步有些可能会感到奇怪,既然c转汇编在编译阶段已经完成了,那汇编要干嘛呢?我们要知道,汇编语言并不是最原生的语言,在计算机底层,是以0,1信号来执行的。而汇编这一步,就是将汇编语言转成二进制机器语言,将汇编文件转换成二进制目标文件
(4)链接
虽然此时我们已经有了二进制目标文件,但该文件我们此时依然无法执行。因为虽然我们写了这份代码,但代码中调用的c标准库中的函数还没有实现。而链接就是将我们写好的代码与c标准库中对应的代码合起来,使得我们调用的函数可用。

此时我们直接执行“gcc test.c”命令,就会直接帮我们生成对应的可执行程序

要注意的是,预处理用的命令是“-E”,生成的文件后缀是“.i”;编译用的命令是“S”,生成的文件后缀是“.s”;汇编用的命令是“-c”,生成的文件后缀是“.o”

2.动态链接和静态链接

1.动态链接

优点:

动态链接是从库里面找方法,这就意味着程序本身并不包含库,也就说明动态链接的程序存储占用会比较小。在加载到内存时体积小的程序也会比较快

缺点:

动态链接需要到库里面去寻找方法,这就导致如果库因为某些原因无法使用,比如上文中说的食堂需要装修就好比是库需要更新换代了,此时程序就无法运行了。虽然更新后也许会更好用,但在更新时我们是无法使用的

2.静态链接

优点:

静态链接的优点在于程序运行不会受库的影响。就好比在你能够在宿舍自己做饭的情况下,食堂无论发生什么都影响不到你,无论是好是坏。静态链接也一样,库的情况不会影响到程序的运行

缺点:

静态链接实现的方法就是要将程序需要的资源放到程序中,同时程序内部解决一个需要调用库里面的代码的问题时,需要拷贝一份内部的解决方法到对应的位置,这就会不可避免的导致程序存储占用增加。并且程序在运行时需要加载到内存里,程序体积大就会导致加载时间长

3.动态库与静态库

1.含义

简单来讲,动态库就是程序库函数跳转后找到的库,静态库则是存在于程序内部的库

2.动态库与静态库的区分

动态库和静态库前缀都是由“libxxxx”组成的,区别在于后缀。动态库后缀是“.so”,静态库后缀则是“.a”。

而库的名字就是去掉前缀lib和后缀后的名字。如以下库:

去掉前缀lib和后缀“.so.6”和就只剩下c,这个库其实就是c标准库

3.系统中的动态库与静态库

注意,千万不要随便删除系统中的c动态库。因为系统中的指令都是依赖与c动态库的,一旦删除,系统中的大部分指令就都无法使用

同时区别于静态库可能存在相同的几份拷贝,动态库可以看成是一个共享库,只要你用c写的程序能链接到动态库,那么你只需要有一份动态库即可,无需多份拷贝
1)c静态库

一般而言,系统中会默认存在动态库,静态库则不一定有。如果你的系统中没有静态库又需要用到静态库,就要使用“yum install -y glibc-static”命令下载静态库。如果是普通用户就要在前面加上“sudo”

(2)c++静态库

既然C语言有静态库,同样的C++也有静态库,如果需要安装C++的静态库,输入“yum install -y libstdc+±static”命令即可。普通用户也需要带上“sudo”

4.gcc与g++
gcc和g++是两个编译器。前面我们在编译程序时,写的都是c语言的代码,这些c程序就是需要使用gcc编译器。如果我们以后用的是C++语言来写程序,就需要使用g++编译器。使用方法也很简单,编译时将gcc改为g++即可

二、linux项目自动化构建工具(make/makefile)(原文链接:https://blog.csdn.net/Masquerena114514/article/details/127759176)

1.含义
在现在我们写的程序都是小型程序,基本只有2个或3个文件。但是在实际中我们会遇到一个大型程序中有成百上千乃至更多文件的情况。在这种情况下,就会有文件先编译后编译和其他更加复杂的操作需求。由我们一个个去执行效率是很低的,为此就有了makefile这一“自动化编译工具”

2.make和makefile
makefile是一个文件,在这个文件中存有我们程序编译执行的相关逻辑等内容,可以支持工程的自动化编译,提高软件开发的效率。

make则是一个命令工具,用于解释makefile中的指令。

3.make和makefile的使用
假设现在我们有以下一个file.c程序:
在这里插入图片描述
makefile在系统中并不存在,使用时需要我们自行创建。此时我们自行创建一个makefile文件:
在这里插入图片描述
然后我们在makefile文件中写入以下内容:
在这里插入图片描述
这条命令想必大家都很熟悉,就是用来形成可执行程序的。我们将这些内容保存后退出,然后执行make命令:
在这里插入图片描述
可以看到在我们没有执行“gcc file.c -o myfile”命令的情况下,生成了的对应的myfile可执行程序。这是因为使用make命令后就会将makefile文件中的命令逐个执行,而makefile中是写了对应的执行命令的
4.makefile原理
在makefile中要包含两个东西,“依赖关系”和“依赖方法”。

举个例子,假如你现在到月底了,没有生活费了,那需要向家里要生活费。此时你打电话给你爸,告诉他你没生活费了,要你爸发钱给你。那此时为什么你爸会发钱给你呢?那是因为你是你爸的儿子,这就是“依赖关系”。然后你需要的是你爸把钱发给你解决你没有生活费的问题,你爸把钱发给你这个动作就是“依赖方法”

(1)makefile使用
在makefile中,首先要包含“依赖关系”。在makefile文件中的第一行就是依赖关系。

1.用make生成一份可执行程序
例如我们现在有以下程序,我们想用make命令让这个程序生成一份“可执行程序myfile”
在这里插入图片描述
为此,我们就要在makefile文件的第一行写上“依赖关系”,即“myfile:file.c”:
在这里插入图片描述
左边的myfile就是我们要形成的myfile目标文件,右边的file.c则是我们的依赖文件列表。“:”代表了依赖关系。这行代码表明的就是依赖关系——myfile文件的形成依赖与file.c

新起一行,也就是第二行就是我们的依赖方法。此处我们是要形成一份可执行程序,因此我们就在第二行写上对应的命令:
在这里插入图片描述
此时我们就有了一个简单的makefile文件。此时我们直接使用make键就可以执行对应的命令:
在这里插入图片描述
2.用make删除一个可执行程序

现在我们的makefile文件中已经有了生成可执行程序的代码,但是还缺少删除该可执行程序的命令。此时我们就可以在makefile文件中写上“clean”,并带上对应的依赖方法来清理,:
在这里插入图片描述
现在makefile中的清理文件命令就写好了。现在如果我们想生成可执行程序就使用“make”,想清理文件就使用“make clean”:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值