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

=========================================================================

个人主页点击直达:小白不是程序媛

Linux专栏:Linux系统学习

=========================================================================

目录

前言

Linux系统下安装gcc和g++

gcc和g++的不同

gcc/g++的使用

gcc/g++选项

预处理

头文件的展开

宏替换

注释的删除

条件的编译

编译

汇编

链接

系统库

库的分类

库的安装

库的命名

C++语言的后缀


前言

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


Linux系统下安装gcc和g++

安装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文件

预处理

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

头文件的展开

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

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

宏替换

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

注释的删除

 

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

条件的编译

 

 

 

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

编译

将代码编译成汇编代码

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

 

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

汇编

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

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

 

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

链接

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

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

链接起来便可以执行。


系统库

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

库的分类

动态库

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

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

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

静态库

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

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

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

库的安装

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

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

C动态库安装

yum install glibc-static

 

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

C++静态库安装

yum install libstdc++-static

库的命名

.so :动态库   XXX.dll

.a:静态库  XXX.lib


C++语言的后缀

.cpp

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

.cc

.cxx

今天代码的编译器gcc/g++的分享到这里就结束了,我们以如何从一个.c文件到可执行程序的四个过程为例展示我们gcc/g++的使用。大家看完文章后结合上篇文章自己在Linux下编写一个代码可以试试。希望大家读完文章有很大的收获,也希望大家留言指出我文章中出现的内容,同时也感谢各位看官的三连支持,你们的支持就是我更新的动力!!!


下篇预告:make/Makefile(自动化构建代码)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/113560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[计算机提升] Windows系统软件:娱乐类

3.3 系统软件:娱乐类 3.3.1 Windows Media Player:dvdplay Windows Media Player是Windows操作系统自带的多媒体播放软件,用于播放和管理电脑中的音频和视频文件。它提供了以下功能: 播放音频和视频文件:Windows Med…

基于ThinkPHP+MySQL实现的通用的PHP网站后台管理系统

caozha-admin 后台管理框架 1.8.3 caozha-admin是一个通用的PHP网站后台管理框架,基于开源的ThinkPHP开发,特点:易上手,零门槛,界面清爽极简,极便于二次开发。 基础功能 1、系统设置 2、管理员管理 3、…

搭建ELK+Filebead+zookeeper+kafka实验

一、ELKFilebeatkafkazookeeper架构 架构图分别演示 第一层:数据采集层 数据采集层位于最左边的业务服务集群上,在每个业务服务器上面安装了filebead做日志收集,然后把采集到的原始日志发送到kafkazookeeper集群上。 第二层:消…

vue3中,使用html2canvas截图包含视频、图片、文字的区域

需求:将页面中指定区域进行截图,区域中包含了图片、文字、视频。 第一步,先安装 npm install html2canvas第二步,在页面引入: import html2canvas from html2canvas;第三步,页面使用: 1&…

SpringCloudGateway--过滤器(自定义filter)

目录 一、概览 二、通过GatewayFilter实现 三、继承AbstractGatewayFilterFactory 一、概览 当使用Spring Cloud Gateway构建API网关时,可以利用Spring Cloud Gateway提供的内置过滤器(filter)来实现对请求的处理和响应的处理。过滤器可以…

TiDB 企业版全新升级,平凯数据库核心特性全解读

作为 TiDB 企业版的全新升级,平凯数据库一经推出便广受媒体及用户关注。 近日,平凯星辰首席科学家丁岩在“平凯数据库全解读”活动中,首次详细介绍了平凯数据库的核心能力。 本文为丁岩演讲实录全文,为方便阅读,已做部…

物联网AI MicroPython传感器学习 之 QMC5883指南针罗盘传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 QMC5883是一款表面贴装的集成了信号处理电路的三轴磁性传感器,应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。 引脚定义 VCC:3V3&#…

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试:开源项目 开源项目完整代码及基础教程: https://mbd.pub/o/bread/ZZWclp5x CNN模型: 1.导入必要的库和模块&…

数据结构与算法:使用数组模拟环形队列Java版

文章目录 如何使用数组模拟队列环形队列逻辑分析自己写的听课笔记实现代码部分方法说明 如何使用数组模拟队列 不知道如何使用数组模拟队列的可以看上一篇文章 使用数组模拟队列点击跳转 环形队列逻辑分析 自己写的听课笔记 实现代码 package com.haimeng.queue;import java…

uniapp-自定义表格,右边操作栏固定

uniapp-自定义表格,右边操作栏固定 在网上找了一些,没找到特别合适的,收集了一下其他人的思路,基本都是让左边可以滚动,右边定位,自己也尝试写了一下,有点样式上的小bug,还在尝试修…

多线程锁的升级原理是什么

在 Java 中,锁共有 4 种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。 多线程锁锁升级过程 如下图所示 多线程锁的升级过程…

在NISQ小型计算机上执行大型并行量子计算的可能性

简介 Steve White提出了密度矩阵重整化群(DMRG)的基本思想,即纠缠是一种有价值的资源,可以用来精确或近似地描述大量子系统。后来,这一思想被理解为优化矩阵积状态(MPS)的算法,支持…

Android开发笔记(三)—Activity篇

活动组件Activity 启动和结束生命周期启动模式信息传递Intent显式Intent隐式Intent 向下一个Activity发送数据向上一个Activity返回数据 附加信息利用资源文件配置字符串利用元数据传递配置信息给应用页面注册快捷方式 启动和结束 (1)从当前页面跳到新页…

[idea]关于idea开发乱码的配置

在JAVA开发中,一般统一设置为UTF-8的编码,包括但不限于开发工具、日志架构、虚拟机、文件编码等。常见配置如下: 1、IDEA工具 在idea64.exe.vmoptions、idea.exe.vmoptions中添加: -Dfile.encodingUTF-8 2、JAVA 运行在window…

python科研绘图:条形图

条形图(bar chart)是一种以条形或柱状排列数据的图形表示形式,可以显示各项目之间的比较。它通常用于展示不同类别的数据,例如在分类问题中的不同类别、不同产品或不同年份的销售数据等。 条形图中的每个条形代表一个类别或一个数…

区块链与教育:颠覆传统,引领未来

区块链与教育:颠覆传统,引领未来 摘要:本文将探讨区块链技术在教育领域的应用及其潜在影响。通过介绍区块链技术的基本原理、教育领域的现状,以及区块链技术在教育中的实际应用案例,我们将展望一个去中心化、安全可信…

软件测试面试高频30道面试题

如果哪个测试经理在看我的文章,希望对面试者要微笑,不然面试结束,出门之后就一万个草泥马奔腾而过,其实面试者并不是希望你给他们什么,而是一种尊重,平等的谈话,不要高高在上感觉自己超牛逼一样…

【星海出品】VUE(一)

Windows安装nvm控制器 Windows里找都PowerShell。右击点击管理员运行。 1.安装choco Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString(https://chocolatey.org/install.ps1))2.安装NVM choco install nvm 3.查看可…

【HeidiSql_01】python在heidisql当中创建新表的注意事项

python在heidisql当中创建新表的注意事项 假设你已经在python当中弄好了所有的结果,并且保存在df_all这个dataframe当中,然后要将其导入数据库当中并创建一张新的表进行保存。 # 构建数据库连接,将merged_df写回数据库 from sqlalchemy import create_e…

中海达守护电力人员作业安全

近日,中海达为电网某换流站作业人员提供的160余套北斗高精度定位产品顺利完成交付。通过使用北斗高精度定位技术,帮助换流站实现了人员(车辆)位置实时定位、电子围栏实时预警、远程作业指导等应用效果,用高科技保障电网…
最新文章