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

news2024/10/7 6:49:13

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

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

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.coloradmin.cn/o/1164388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT-Thread 9. VS2012下仿真RT-Thread 和LVGL

1. 在ENV中添加组件 2. 下载组件 3. 生成代码 4. 打开代码 双击project.vcxproj 编译 5. 运行

偶数矩阵判断【C语言作业】

题目 若一个布尔矩阵所有行和所有列的和都是偶数&#xff0c;则称为偶数矩阵。请编写一个程序&#xff0c;判断一个布尔矩阵是否是偶数矩阵。 要求&#xff1a; &#xff08;1&#xff09;输入:首先输入一个正整数n(n<100),代表该矩阵的大小&#xff0c;接下来是n行n列的矩…

Vue实现消费清单明细饼图展示

功能 可以进行消费项增删消费额大于500会标红消费金额合计饼图展示消费项 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-…

代码随想录算法训练营第四十一天 | LeetCode 416. 分割等和子集

代码随想录算法训练营第四十一天 | LeetCode 416. 分割等和子集 文章链接&#xff1a;01背包理论基础 01背包理论基础&#xff08;滚动数组&#xff09; 分割等和子集 视频链接&#xff1a;01背包理论基础 01背包理论基础&#xff08;滚动数组&#xff09; 分割等和子集 1. 01 …

腾讯云双11活动时间、活动入口、优惠政策详细解读

2023年腾讯云双11大促活动已开启&#xff0c;作为年终最大的一次优惠促销活动&#xff0c;腾讯云的优惠力度还是不错的&#xff0c;爆款云服务器首年88元&#xff0c;还有9999元大额代金券免费领取&#xff01; 一、腾讯云双11活动时间 即日起至2023-11-30 23:59:59&#xff0…

Envoy动态配置

Envoy动态配置 本节我们将学习 Envoy 的核心 - 动态配置的使用。 目录 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Envoy动态配置-EDS-2023.10.31(测试成功)&#x1f6a9; 实战&#xff1a;基于 API 的动态配置-2023.11.2(测试成功) 1、基于文件的动态配置 Envoy 除了…

Python实现自动化网页操作

1 准备 推荐使用Chrome浏览器 1.1 安装selenium程序包 激活虚拟环境&#xff0c;打开新的Terminal&#xff0c;输入以下代码&#xff1a; python -m pip install selenium 如下图所示&#xff0c;表示安装成功&#xff0c;版本为4.7.2 安装成功 关闭虚拟环境&#xff0c;打…

nginx项目部署教程

nginx项目部署教程 1. 项目部署介绍 当我们的项目开发完毕后&#xff0c;我们需要将项目打包、部署到服务器上&#xff0c;供用户来使用。 目前&#xff0c;常见的部署方式有两种&#xff1a; 后端部署 前后端分离部署 1-1 后端部署 这是最古老的部署方式&#xff0c;也是…

提升ChatGPT答案质量和准确性的方法Prompt engineering

文章目录 怎么获得优质的答案设计一个优质prompt的步骤:Prompt公式:示例怎么获得优质的答案 影响模型回答精确度的因素 我们应该知道一个好的提示词,要具备一下要点: 清晰简洁,不要有歧义; 有明确的任务/问题,任务如果太复杂,需要拆分成子任务分步完成; 确保prompt中…

TSINGSEE青犀智能视频管理监督系统在车站场景中的应用方案

旭帆科技的智能视频监控系统可应对绝大多数场景&#xff0c;近期就有一个粉丝私信&#xff0c;随着年关将近&#xff0c;越来越多的人需要返乡和外出旅游&#xff0c;高铁站、火车站这些地方人员密集度高&#xff0c;发生事故的风险也大&#xff0c;问我们有没有关于车站的智能…

Python最强自动化神器Playwright!再也不用为爬虫逆向担忧了!

版权说明:本文禁止抄袭、转载,侵权必究! 目录 一、简介+使用场景二、环境部署(准备)三、代码生成器(优势)四、元素定位器(核心)五、追踪查看器(辅助)六、权限控制与认证(高级)七、其他重要功能(进阶)八、作者Info一、简介+使用场景 Playwright是什么?来自Chat…

不是我吹牛逼,这绝对是去掉 if...else 最佳的文章

我相信小伙伴一定看过多篇怎么去掉 if…else 的文章&#xff0c;也知道大家都很有心得&#xff0c;知道多种方法来去掉 if…else &#xff0c;比如 Option&#xff0c;策略模式等等&#xff0c;但我相信大明哥这篇文章绝对是最全&#xff0c;最完备怎么去掉 if…else 的文章&am…

Git保姆级教学(超详细版)

一、Git概述 Git 是一个免费的、开源的 分布式版本控制系统 &#xff0c;可以快速高效地处理从小型到大型的各种 项目。 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作 流分支等特性。其性能优于 Sub…

开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) 震惊&#xff01;测试人员对BUG的全方位解析&#xff0c;测试的执行和BUG管理&#xff01; 原来测试人员遇到BUG是这样返回给开发的&#xff01;什么是BUG&am…

ElasticSearch 批量插入漏数据

项目场景&#xff1a; 项目中需要把Mysql数据同步到ElasticSearch中 问题描述 数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据&#xff0c;本地测试也无法复现&#xff0c;后台程序也没有报错&#xff0c;一到正式环境就有问题,很崩溃 这里是批量操…

泰坦陨落2报错找不到msvcr120/msvcp120丢失实用解决方法

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是msvcr120.dll缺失。msvcr120.dll是Microsoft Visual C Redistributable的一个组件&#xff0c;它包含了运行许多基于Windows的应用程序所必需的库文件。当这个文件丢失或损坏时&#xff0c;可能会…

【JAVA学习笔记】59 - JUnit框架使用、本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter15/src/com/yinhai/homework JUnit测试框架 1.基本介绍 1. JUnit是一个Java语言的单元测试框架 2.多数Java的开发环境都已经集成了JUnit作为单元测试的工具 2.如何使用 创建方法后&#x…

LeetCode 70.爬楼梯 + 记忆化搜索 + 递推 + 动态规划 + 空间优化

关于此题的我的往期文章&#xff1a; leetCode 70.爬楼梯 动态规划_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133325224?spm1001.2014.3001.5501 上i-1层楼梯&#xff0c;有 dfs(i-1) 种方法&#x…

Sqlyog 无法连接 8 版本的mysql caching_sha2_password could not be loaded

Sqlyog 无法连接 8 版本的mysql caching_sha2_password could not be loaded 1.问题背景 近期系统对Mysql 版本进行了升级&#xff0c;由原来的 5.7升至 8版本&#xff0c;在现场使用Sqlyog 作为数据库连接软件时&#xff0c;发现连接失败。 2.问题现象 使用Sqlyog配置完连…

Oracle 19c 可插拔数据库PDB的创建方式

多租户容器数据库架构图总览 多租户容器数据库组成部分&#xff1a; 1.有且仅有一个CDB Root(CDB$ROOT)&#xff0c;它包含了Root和所有PDB数据库的元数据和数据字典信息。 2.有且仅有一个Seed PDB(PDB$SEED),它的作用是创建其他PDB的模板&#xff0c;它是只读库&#xff0c;…