【Linux】gcc/g++编译器、make/Makefile自动化构建工具

简介: 目录 1.gcc/c++的概念:2.程序编译过程详解:2.1程序编译过程:

作者:小卢

专栏:《Linux》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》

目录

 1.gcc/c++的概念:

2.程序编译过程详解:

2.1程序编译过程:

2.2gcc指令:

2.3在Linux中如何实现四种过程

2.3.1如何直接生成可执行程序呢?

2.3.2预处理过程:

2.3.3编译过程:

2.3.4汇编过程:

2.3.5链接过程:

3.动态库和静态库:

3.1动态库和静态库的区别:

3.2linux中如何区别静态库和动态库:

编辑3.3如何进行静态链接:

4.make/Makefile自动化构建工具

4.1依赖关系&&依赖方法:

4.2清理:

4.3使用make不成功的常见原因及解决方法:



 1.gcc/c++的概念:

gcc/g++为Linux中的编译器。

2.程序编译过程详解:

2.1程序编译过程:

程序编译分为四个过程:

1.预处理   2.编译     3.汇编       4.链接

  • 预处理(头文件展开,条件编译,宏替换,去注释等)是
  • 编译(c语言汇编语言)
  • 汇编(汇编->可重定位目标二进制文件,不可以被执行的,bin.obj)只把我们自己的代码进行翻译形成二进制目标文件
  • 链接(将我们这自己形成的.obj文件和库文件某种合并,形成可执行程序)

2.2gcc指令:

gcc 选项 编译后的文件 编译的文件

后面会有演示。

2.3在Linux中如何实现四种过程

2.3.1如何直接生成可执行程序呢?

gcc 文件名 可以将文件直接编译成一个a.out的可执行程序

当需要生成一个需要由指定文件名的可执行程序如何操作呢?

-o为目标文件

gcc -o myfile myfile.c

2.3.2预处理过程:

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

预处理指令是以#号开头的代码行。

“.i”文件为已经过预处理的C原始程序

“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

gcc -E myfile.c -o myfile.i

可以对比一下预处理过后两者的代码:

2.3.3编译过程

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。

“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

编译操作可以从.c文件开始,也是从点.i文件。

gcc -s myfile.i -o myfile.s

2.3.4汇编过程:

汇编阶段是把编译阶段生成的“.s”文件转成目标文件

读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码

gcc -c myfile.s

2.3.5链接过程:

在成功编译之后,就进入了链接阶段。

gcc -c myfile.s -o myfile.o

3.动态库和静态库:

3.1动态库和静态库的区别:

概念引入:

你是一名刚上高中的学生,你在上高中前就向振华中学的学长打听了网吧的位置,你的学长跟你说:校门口出去往右走两百米就可以看见一件网吧。你来了振华中学一两个星期了,当周六日的时候,你写完了数学和英语作业,你想先出去上网打一会永劫无间放松放松再回来写物理作业和化学作业。因此你就这么干了。

网吧有很多个电脑,你每次去网吧都是不同的机子,每台机子都是每个人都可以去上网的,因此这台机子是共享机子。

当你爸爸因为你考了年级第一时,给你买了改电脑,你可以用你自己的电脑来打永劫无间放松了。你不再需要去网吧了,有一天这个网吧被举报了,大家不可以去上网了,但你有你自己的机子因此你不受影响。

你自己的机子相当于静态库,而网吧的机子相当于动态库

那静态库比较好?两者的区别呢?

  • 1.库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器, 对用户的程序进行动态链接的)
  • 2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中
  • 3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位
  • 4.静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行
  • 5.动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行!
  • 6.静态库,因为自身拷贝的问题,比较浪费空间
  • 7.动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间
  • 8.静态库vs动态库: Linux默认使用的是动态链接和动态库!

3.2linux中如何区别静态库和动态库:

静态库和动态库两者的表示不同:

1.静态库: libXXXXXX.a
2.动态库: libXXXXXX.so

3.3如何进行静态链接:

-static 静态链接选项

gcc myfile.c -o myfile-static -static

使用静态链接是需要有静态库的,当没有静态库时,会出现下面这种情况

如何安装静态库?

sudo yum install -y glibc-static

4.make/Makefile自动化构建工具

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

4.1依赖关系&&依赖方法:

  • 将myfile.c变为myfile,称为依赖关系
  • gcc那一行叫做依赖方法

4.2清理:

clean:换行后删除语句

但是一般我们这种clean的目标文件,我们将它设置为伪目标

用 .PHONY 修饰,伪目标的特性是,总是被执行的。

4.3使用make不成功的常见原因及解决方法:

当你文件已经是最新版本时,系统就认为你不需要在进行make操作就会报这样的报错

如果我们想要make的话,需要将源文件改一下然后再make就可以成功啦

我们可以通过时间来判断文件是否是最新的!

stat 文件名 可以查看时间

touch可以更改为最新时间

相关文章
|
4月前
|
安全 Linux Shell
四、Linux核心工具:Vim, 文件链接与SSH
要想在Linux世界里游刃有余,光会“走路”还不够,还得配上几样“高级装备”。首先是Vim编辑器,它像一把瑞士军刀,让你能在命令行里高效地修改文件。然后要懂“软硬链接”,软链接像个快捷方式,硬链接则是给文件起了个别名。最后,SSH是你的“传送门”,不仅能让你安全地远程登录服务器,还能用scp轻松传输文件,设置好密钥更能实现免-密登录,极大提升效率。
429 4
|
4月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
426 16
|
4月前
|
安全 Linux iOS开发
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
257 0
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
|
6月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
192 1
Linux系统性能调优技巧和相关工具
|
6月前
|
Linux 数据安全/隐私保护 iOS开发
推荐Linux环境下效能优良的双向文件同步工具
综合上述条件,对于Linux环境下的双向文件同步需求,Unison 和 Syncthing 是两个非常出色的选择。它们都有良好的社区支持和文档资源,适用于不同规模的环境,从个人使用到商业部署。Unison 特别适合那些需要手动干预同步过程、需要处理文件冲突解决的场景。而 Syncthing 更加现代化,适合需要自动、实时的数据同步与备份的环境。对于选择哪一个,这将取决于个人的使用场景和具体需求。
757 16
|
5月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
8月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
440 32
|
7月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
394 0

热门文章

最新文章