【Linux系统学习】系统编程开发工具编译器gcc/g++使用

简介: 上篇文章我们进入Linux系统编程的学习,介绍了代码的编辑器vim多功能编辑器的使用,编辑器的上手还是挺难的,要通过多多练习各个模式的命令集慢慢熟练起来。代码能够编辑后我们就要对代码进行编译运行,在Linux系统中我们使用gcc和g++编译器对我们写的代码进行编译运行。为了深入学习我们将从一个.c的源文件通过预处理、编译、汇编、连接变成我们的可执行程序使用gcc编译器详细呈现。

Linux系统下安装gccg++

安装gcc

yum -y install gcc


安装g++

yum -y install gcc-c++


gcc和g++的不同

gcc和g++对于C语言适用,而C++只能使用g++编译


gcc/g++的使用

格式         gcc/g++ [选项] 要编译的文件 [选项] [目标文件]


gcc/g++选项

·       -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

·       -S 编译到汇编语言不进行汇编和链接

·       -c 编译到目标代码

·       -o 文件输出到 文件

·       -static 此选项对生成的文件采用静态链接

·       -g 生成调试信息。GNU 调试器可利用该信息。

·       -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

·       -O0

·       -O1

·       -O2

·       -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

·       -w 不生成任何警告信息。

·       -Wall 生成所有警告信息。

例如:-o可以修改编译成功后的文件名,而不是默认生成a.out文件

 fd8ffdf380284d16935c4ea3d5195c16.png

预处理

源文件编译第一步是进行预处理,其作用为头文件的展开、宏替换、去掉注释、条件编译

头文件的展开

 76c758dce71a405089e6451c75c10733.png

-E表示预处理后就结束,-o将文件名

 

fa17a4258ebe4a6daf99bb1e770ef5a8.png

头文件include也就900多行,去掉注释在.i的文件中800多行,头文件展开相当于直接将头文件复制在.i文件中

宏替换

 

9fe611806c594be4a9e88debb7e924a4.png

直接打开刚才预处理好的.i文件;和.c源文件进行对比。我们会发现我们定义的宏在代码中已经全部替换。

注释的删除

 bb40db21091c46d886b7431dbc7354a7.png

预处理后我们的注释会被删除;

条件的编译

 c0b9eccfea134c1b9f93f9976b58d41b.png

6f2f42fcf9344d16b3161862f9582e1f.png

60d2185ef5d1464cbe023d3a5f996da1.png


条件编译会根据你设置的条件而删除一些代码。

编译

将代码编译成汇编代码

-S表示进行到程序的编译,编译完成即可停止。

 

fb25baa14af84c6fac1270afcf1c7475.png

59eddeb3ce9c40459cb6b6f57e75bcc6.png

左边为我们的初始源文件,右边为执行完编译后的文件,为汇编代码。

汇编

将汇编代码转化为二进制代码。

 429eeb8bc10146b2a7ffe522d43f3a82.png

-c表示执行到汇编结束后就停止。

 a80e4771fe114c0db17349ae752b03a9.png

左边为我们的初始源文件,右边为执行完汇编后的文件,为二进制代码。

链接

通过上面我们可以的到一个.o文件

c5f049d531784e92be8d8cf4da73b423.png

虽然.o文件时二进制依然执行不了,需要进行链接。链接是将我们的.o文件和系统库链接起来。

 cc0e0403487b4a3daaacbb15f93b844d.png


链接起来便可以执行。


系统库

我们现在所写的代码和各种编译器如何编译都是通过很多的年的发展所形成的,编写代码的过程中有很多我们不需要实际完成的函数,像输入,输出函数、字符串相关的函数等等,是系统帮助我们实现的。是以库的形式呈现给我们的。

库的分类

动态库

C/C++或者其他第三方提供所有方法的集合,被所有程序以链接的方式,动态关联起来。

优点:形成的可执行程序体积比较小,比较节省资源

缺点:稍微慢一些,强依赖动态库,动态库没了,所有的依赖这个库的程序都无法运行了

静态库

C/C+或者其他第三方提供的所有方法的集合,被所有的程序以拷贝的方式,将需要的代码拷贝到自己的可执行程序中,静态关联起来。

优点:无视库,可以独立运行

缺点:体积太大,浪费资源

库的安装

系统一般默认是不会安装静态库的,只有动态库。

 b61dbc7213bd489395a90c9d652307b3.png


使用static我们可以使用静态库,但是我们没有安装静态库,执行不了。

C动态库安装

yum install glibc-static

1d9fde3b72524d7d84580ae38817ac52.png

 

2d7b3807f0c04c209adf87034cb2b16f.png


使用静态库后我们明显看到体积会变大

C++静态库安装

yum install libstdc++-static


 5f94dd6833a44385a6cd128732570ebc.png

库的命名

.so 动态库   XXX.dll

.a静态库  XXX.lib


C++语言的后缀

.cpp

 

72f621d6b52c4b98bbef8746ab896537.png

如上图我们使用gcc编译.cpp文件是编译不过去的

.cc

1aedd96f08de425baa42746a2a7b763a.png

.cxx

 48dca82687264820b86922375179fa1f.png

相关文章
|
7月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
666 3
Linux系统禁用swap
|
7月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1220 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
758 3
Linux系统初始化脚本
|
7月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
911 1
|
7月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1276 1
|
NoSQL Linux 开发工具
Linux开发工具的使用
1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用     1.
1474 0
|
7月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
850 1
二、Linux文本处理与文件操作核心命令
|
7月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
486 137
|
7月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1320 58
|
6月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1189 2