在Linux中使用gcc/g++编译代码

news2024/11/20 9:46:48

gcc/g++

  • 1.方法速记
  • 2.具体过程
    • 2.1 预处理阶段
    • 2.2 编译阶段
    • 2.3 汇编阶段
    • 2.4链接阶段
      • 2.4.1 链接的细节
  • gcc和g++的操作一样,g++的方法就仅需把gcc换成g++即可。

1.方法速记

直接编译语法:将text.c文件或者text.cpp文件直接编译成text文件。

  • gcc text.c -o text // gcc-o text.c text
  • g++ text.cpp -o text // g++ -o text.cpp text
  • 注意:-o后面一定对应着目标文件(可执行文件)就好啦。

2.具体过程

2.1 预处理阶段

预处理的过程就是头文件包含,去注释,宏替换的过程。
预处理指令是以#开头的代码行。

将text.c文件预处理后变成text.i文件

  • gcc -E text.c -o text.i
    -E的选项是让gcc在预处理结束后就停止编译。

在这里插入图片描述
观察可以看到,预处理过后的文件800多行,头文件被包含在里面,并且观察main里面,具体的注释已经被去掉。

2.2 编译阶段

编译阶段是指将预处理后的代码变成汇编语言。

将text.c变成text.s或者将text.i变成text.s:

  • gcc -S text.i -o text.s
    -S:从现在开始进行编译,如果编译成功就停止下来。

在这里插入图片描述

2.3 汇编阶段

将汇编语言变成二进制代码。

将text.c/text.s文件变成text.o文件:

  • gcc -c text.s -o text.o
  • .o文件又叫可重定位目标文件。
    -c:从现在开始进行程序的翻译,如果汇编完成,就停下来。

使用od -x 文件命令,查看机器代码:
在这里插入图片描述

2.4链接阶段

将汇编阶段生成的.s文件转成目标文件(可执行文件)。

将text.o文件链接成可执行文件text:

  • gcc text.o -o -text

在这里插入图片描述

2.4.1 链接的细节

链接:动态链接和静态链接。
动态链接是将库(动态库.so)中我要的方法地址,填入我的可执行程序中,建立关联。(节省资源)
静态链接是直接将库(静态库.a)中的方法真的拷贝到我们的可执行程序中。(占用资源)


gcc或者g++默认使用动态链接编译过程。

  • 查看文件链接属性
  • file 文件名

在这里插入图片描述


  • 将源程序采用静态链接的策略
  • gcc text.c -o text-s -static
    -static:生成的目标文件采用静态链接
    在这里插入图片描述
    观察到文件大小差异很大。

在C程序中,并没有定义"printf"函数的实现,并且在预编译中的“stdio.h”头文件中只有该函数的声明,并没有该函数的实现,那么程序是如何运行"printf"的呢?
事实上,gcc默认是动态链接,预处理把printf函数的声明放到.i文件后,链接阶段可以根据该函数的声明(该函数定义的地址)找到函数的实现,从而实现连接过程。
可以使用ldd指令查看程序链接动态库的情况:

在这里插入图片描述

gcc和g++的操作一样,g++的方法就仅需把gcc换成g++即可。

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

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

相关文章

微软 Visual Studio 现已内置 Markdown 编辑器,可直接修改预览 .md 文件

Visual Studio Code V1.66.0 中文版 大小:75.30 MB类别:文字处理 本地下载 Markdown 是一种轻量级标记语言,当开发者想要格式化代码但又不想牺牲易读性时,Markdown 是一个很好的解决方案,比如 GitHub 就使用 Markdo…

公司阿里云服务器被暴力破解

公司阿里云服务器被暴力破解? 公司云服务器跑了3年了,从来没改过密码,而且基本所有服务器密码都是同一个,只把公司IP添加白名单了。(确实不严谨,但至少限制了连接源) 突然就收到阿里云短信提醒…

ppt如何转pdf文档?用这个方法可将ppt转pdf

在现代社会中,PPT(幻灯片)已成为一种常见的演示工具,被广泛应用于学术、商务、培训等领域。然而,PPT文件的使用和分享存在一些问题,例如文件格式不兼容、内容修改易被篡改等。为了解决这些问题,将PPT转换为PDF格式已成…

【一文读懂】 Java并发 - 锁升级原理

要明白锁的原理,首先要知道对象头 Java对象头 在Java中,一个对象一般由两部分组成 :1、对象头 ; 2、对象的成员变量信息 在32位的虚拟机中: (1)普通对象的对象头长度64bit(8字节&…

Javascript 编写一个简单的聊天机器人

在本 Web 开发教程中,我们将了解如何使用 HTML、CSS 和 vanilla JavaScript 创建基本的聊天机器人。本练习侧重于 JS 基础知识,而不是任何类型的人工智能 (AI)。为了使该过程更简单,更易于学习,我没有使用任…

ffmpeg windows环境MinGW+msys2编译so库

一、安装MinGW 1.1、下载MinGW 1.2、下载完成后,会得到一个名为 mingw-get-setup.exe 的安装包,双击打开它,可以看到如下的对话框: 1.3、直接点击“Install”,进入下面的对话框 1.4、可根据自己操作系统的实际情况&am…

数据库MySQL中left join多个条件下的执行

1 基础表 创建表A 表B create table testA(id int, name varchar(10)); create table testB(id int, name varchar(10)); 2 插入数据 insert into testA values(1,zhangssa),(2,lisi),(3,wangwu) insert into testB values(2,zhangssa2),(3,lisi2),(4,wangwu4) 3 left joi…

WPF自定义命令及属性改变处理

1、项目建构 2、自定义命令 namespace WpfDemo.Base {public class MyCommand : ICommand{Action executeAction;public MyCommand(Action action){executeAction action;}public event EventHandler? CanExecuteChanged;public bool CanExecute(object? parameter){retu…

ssm会员管理系统源码和论文

ssm会员管理系统源码和论文062 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势&#x…

36k字从Attention讲解Transformer及其在Vision中的应用(pytorch版)

文章目录 0.卷积操作1.注意力1.1 注意力概述(Attention)1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚: Nadaraya-Watson 核回归1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力1.3 自注意力(Self-Attention)1.3.1 自注意力的定义和计算1.3.2 自注意…

邀请函 | 区块链如何助力建设“健康中国”?ESG系列研讨会“医疗”专场来袭!

党的十九大报告指出,要全面实施健康中国战略,为人民群众提供全方位全周期健康服务。今年7月,国家卫生健康委等六部门联合印发了《深化医药卫生体制改革2023年下半年重点工作任务》,明确指出要开展全国医疗卫生机构信息互通共享三年…

基于 vue2 发布 npm包

背景:组件化开发需要,走了一遍发布npm包的过程,采用很简单的模式实现包的发布流程,记录如下。 项目参考:基于vue的时间播放器组件,并发布到npm_timeplay.js_xmy_wh的博客-CSDN博客 1、项目初始化 首先&a…

AKM10-58C大电流TVS二极管参数:58V 10000A

东沃(DOWO)AKM10-76C是什么二极管? 东沃生产AKM10-76C大电流TVS二极管吗?有现货吗? 除了AKM10-76C外,东沃(DOWO)生产的贴片大电流二极管还有哪些型号? …… AKM10-76C是厂…

VMware 新装 CentOS 7 连不上网络的【解决方法】

文章目录 1)虚拟机设置2)虚拟网络编辑器3)Linux 网卡设置4)检查网络状态参考资料: 安装好虚拟机之后,将来会在虚拟机内的系统中安装各种应用,如果虚拟机内的系统连不上网,则无从谈起…

PythonJS逆向解密——实现翻译软件+语音播报

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 pycharm 模块使用: requests --> pip install requests execjs --> pip install PyExecJS ttkbootstrap --> pip install ttkbootstrap pyttsx3 --> pip install pyttsx3 第三…

interview2-框架篇

一、Spring篇 1、Spring (1)Bean线程安全问题 不是线程安全的。Spring框架中有一个Scope注解,默认的值就是singleton,单例的。因为一般在spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在b…

【Focal Loss】解决类别不平衡问题,增加对困难样本的挖掘

Focal Loss是在交叉熵损失函数的基础上增加了一个平衡因子 α \alpha α和一个聚焦因子 γ \gamma γ,分别用来调节不同类别样本的权重以及难分样本和易分样本之间的权重一个样本的交叉熵损失函数如下: p t p_t pt​表示将该样本分类为t的概率一个样本的…

8个好用的产品设计工具,收藏一下

产品设计在设计工作中是非常重要的一个环节,它是对产品的初步构思,能明确规定产品设计的细节。今天本文将为大家推荐8个好用的产品设计工具,不仅操作方便,而且简单好用,能充分提高工作效率,一起来看看吧&am…

政府网站定期巡检:构建高效、安全与透明的数字政务

在数字时代,政府网站已不仅仅是一个信息发布窗口,更是政府与公众互动的桥梁、政务服务的主要渠道以及数字化治理的重要平台。因此,确保政府网站的高效运行、信息安全与透明公开就显得尤为重要。在此背景下,定期的网站巡检与巡查成…

搭建微信小程序商城的详细教程

微信小程序商城是一种通过微信平台进行线上购物的应用,它具有界面友好、交互便利、功能实用等特点,成为越来越多企业和个人创业者的选择。下面,我们将为大家介绍如何搭建微信小程序商城的详细教程。 第一步,登录乔拓云平台进入后台…