Linux编辑器-gcc/g++使用

news2024/11/24 5:04:21

目录

背景:

预处理:

 编译:

汇编:

 连接:

静态连接: 

 动态连接:

自动化编程make/makefile:


背景:

        我们知道任何一个c语言或者c++文件想要生成一个可执行程序必须完成4个阶段,预处理、编译、汇编、连接。然而平时我们自己编写代码时,在vs环境或者其它编译环境当中并没有感受到这些变化,只感觉自己代码写好了,然后点击编译,程序即可运行,所以对于我们来说从编写文件到可执行文件只有一步的过程,事实上,这其中所有的操作都是我们的编辑器帮助我们完成了,我们也称这类编辑器为集成化编辑器。下面,我就给大家讲解编辑器在哪一步都做了些什么。

预处理:

        预处理阶段为我们处理了宏定义、文件包含、条件编译、去注释操作,这样看有些抽象,请看下图。

        首先看到我们的一个C语言文件,里面包含了头文件,宏定义,条件编译,还有注释。

        在Linux中的生成预编译文件的指令为 gcc -E test.c -o test.i。文件名可以任意取值,保证后缀正确即可。

         进入了我们的预编译完成文件之后,进入可以看到我们的#include<stdio.h>在文件中被展开成为了一大推的代码,这里我没有截取完全,里面的东西其实就是我们的库文件包含的内容在我们的机器中所存储了位置,也就是完成了我们的文件包含。

        往下翻,找到最后,我们能看到宏定义不见了,全部在代码中被替换,原来主函数中的MAX和MIN都被替换为了100,0,但是在函数中定义的变量num还是保持原样。

        里面的注释也全部被清除,其中test函数中的条件编译只保留了满足条件了那一部分,其余部分直接被清除。这些操作分别对应了宏定义、去注释、和条件编译。

 

 编译:

        编译过程就是将我们预编译文件转换为汇编语言文件。在这个过程当中就是我们的编辑器检查我们的代码是否规范、是否有语法错误。不过汇编语言我也没学过里面的内容看不懂,只是知道有这么一个过程。

        其中部分内容我们还是能勉强阅读,比如有一个主函数main,还有文件名为test.c。

        生成编译文件的指令为:gcc -S test.c -o test.s。

汇编:

        汇编过程就是将汇编语言转换成为二进制代码,这一过程我们更加看不懂,当然也不需要我们看懂,毕竟这是给机器看的。

        生成汇编文件的指令为:gcc -c test.c -o test.o。

 连接:

        通过使用ldd指令,可以得知我的文件使用了那些其它不是我们编写的文件。接下来我会为大家讲解两种不同的连接方式。

静态连接: 

        静态连接这一过程很简单,就像是我们与编译过程当中的头文件包含一样,它会将库文件当中的代码拷贝到我们的代码当中来,不过静态连接拷贝的函数是功能函数而不是头文件当中的代码。静态连接有一个很明显的优点就是它再完成连接之后,与库就不在相关联,就算此时删除库文件,我们的代码依旧能够跑过,但是它也有一个很致命的缺点就是,每调用一个函数,他就会拷贝一份,不管之前是否已经拷贝过。

        生成一个静态连接代码操作为:gcc test.c -o myfile -static,就是正常的生成可执行文件操作,只不过它需要加上-static指令。

 动态连接:

        动态连接这一过程我们可以理解为,在我们的文件当中,调用的库文件函数都被转换成为了一个链接,当函数运行到这个位置时,函数会停下,进入链接,这个链接对应的就是库文件在我们电脑当中的位置,程序会运行到库文件当中,调用完成之后就会返回原位置,继续执行。这个操作的优点就是我们的文件数据不会特别的大,因为不用重复的调用同一个函数,或则不断地加入内容进入文件当中。它的缺点就是就算文件编译完成了,该可执行程序同样的依靠我们地库文件才能够实现功能。

        编辑器默认生成动态链接文件,操作为:gcc test.c -o myfile。

         通过比较上下两张图片,我们可以看到静态链接文件地大小时动态链接文件大小的100倍,差距十分的明显。

自动化编程make/makefile:

        自动化编程的出现是因为,这里的每一条指令写起来都很麻烦,而且写错了之后有可能还会将我们的源代码给清除,这是我们很不想看到的,所以才出现了自动化编程make和makefile。

        首先我们得通过touch创建一个makefile或者Makefile文件,然后通过vim进入该文件。

        其中得myfile是自己命名的可执行文件名,后面的test.c代表需要编译的文件,下方则是需要执行的命令。

        .PHONY:clean表示我们的清除操作可以反复执行。clean是自己命名的操作,与下方的clean:对应。

        编辑完成之后退出,在命令框中写下make,即可默认执行第一个语句。如果想要执行第二条语句就需要写下make clean,也就是make加上功能。知道了这些,我们就可以写下多个不同的指令。其中的函数编译并不代表只能执行一次,而是可以同时编译多个源文件,只需要写好对应的关系即可。

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

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

相关文章

NotepadAttr

EntityMyPKAttr目录概述需求&#xff1a;设计思路实现思路分析1.Notepads2.EntityMyPK3.EntityMyPKAttr4.EntitiesMyPK5.EntityMyPKEntityMyPKAttrEntitiesMyPKWebContralBaseAtParaCashChartType参考资料和推荐阅读Survive by day and develop by night. talk for import biz …

JS面试题--JS函数式编程

JS函数式编程 实现apply、call、bind 01_call函数的实现 // apply/call/bind的用法 // js模拟它们的实现? 难度// 给所有的函数添加一个hycall的方法 同个原型链 Function.prototype.hycall function (thisArg, ...args) {// 在这里可以去执行调用的那个函数(foo)// 问题: …

亚马逊云科技:“云”筹帷幄,打造数据驱动型企业

数据对提高企业生产和资源配置的效率、优化经济结构的作用日益凸显。工业和信息化部发布的《“十四五”大数据产业发展规划》已明确将数据作为新时代重要的生产要素和国家基础性战略资源。埃森哲研究显示&#xff0c;到2022年&#xff0c;90%的企业战略明确将把数据作为关键的企…

前端面试题回顾——React重要知识

文章目录React相关问题1. 函数式组件与Class组件有什么不同&#xff1f;2. 说说React的fiber架构&#xff1f;3. 协调4. 虚拟DOM (Virtual DOM)React相关问题 1. 函数式组件与Class组件有什么不同&#xff1f; 答&#xff1a; ① 函数式组件不需要继承&#xff0c;直接 “fun…

数据结构基础——认识数据结构与算法

目录 &#x1f354;什么是数据结构&#xff1f; &#x1f32d;1.数据的逻辑结构 &#x1f32d;NUM 1 : 集合 &#x1f32d;NUM 2 : 线性结构 &#x1f32d;NUM 2 : 树形结构 &#x1f32d;NUM 4 :图结构&#xff08;网状结构&#xff09;…

浅谈反弹shell

目录反弹shell总结一、文件描述符二、重定向1、输入重定向2、输出重定向3、错误输出重定向4、exec 绑定重定向三、实现反弹shell的几种方式方法一&#xff1a; find 反弹ubuntu find反弹shell失败的问题任务计划反弹shell失败的问题方法二&#xff1a;使用python反弹&#xff0…

Flink系列-4、Flink运行架构

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录Flink基石Fli…

刚当上leader,我让组员去开会,他非说有更重要的会

☆ 职场上经常有那么一种情况就是组长喊组员开会&#xff0c;开周会&#xff0c;开晨会&#xff0c;开各种会&#xff0c;而更有一种常见的情况呢就是组长缺失威严&#xff0c;喊组员开会&#xff0c;组员不听话&#xff0c;说有更重要的会议&#xff0c;不想参加。 ☆ 本文将以…

VIT学习心得

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 小声逼逼 在过去的两年里&#xff0c;Vision Transformer(ViT)是计算机视觉(cv)领域最有影响力的工作之一。「它推翻了2012年在Alex net中提出的CNN在CV领域的统治地位&#xff1a; 当能够获得足够多的预训练…

无接触式磁旋转编码器AS5040介绍

无接触式磁旋转编码器AS5040简介AS5040 是一款无接触式磁旋转编码器&#xff0c;用于精确测量整个360内的角度。此产品是一个片上系统&#xff0c;在单个封装内整合了集成式Hall 元件、模拟前端和数据信号处理功能。测量角度时&#xff0c;只需简单地配备1 个在芯片中心上方旋转…

Spring5的全细节回顾总结

概述&#xff1a; https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md 这个不错。 轻量级javaee框架。 针对于bean的生命周期进行管理。 解决企业应用开发的复杂性。 核心&#xff1a; ​ IOC&#xff1a;控制反转&#xff0c;把创建对象的过程交给sprin…

第一天 Blender操作 | 大帅老猿threejs特训【超详细】

前言 这一天主要是基础理论的学习。 本人学习资料仓库 https://gitee.com/zhang_dezheng_hsr/three-demo.git YCY-TrainingCamp-S2: 在原有的文件上添加本人的学习记录 第一天 Blender操作 | 大帅老猿threejs特训【超详细】【我在掘金的同名文章】 一、大纲 二、THREE 基础概…

Linux查看某个应用的CPU/内存/网卡使用情况

1.查看CPU的使用率 # ps -ef | grep zabbix 进程号是1715 # top -p 1715 可以看到CPU的使用率是0 &#xff0c; 内存的使用率是0 2.查看内存真实使用了多少 #cat /proc/[pid]/status #cat /proc/1715/status VmPeak:进程所使用的虚拟内存的峰值 VmSize: 进程当前使用…

22.字符串初始化方法及赋值,字符串和指针总结

目录 初始化 1.字符数组初始化 2.指针指向文字常量区&#xff0c;初始化 3.指针指向堆区&#xff0c;堆区存放字符串 使用时赋值 1.字符数组&#xff0c;使用scanf或者strcpy 2.指针指向文字常量区 3.指针指向堆区&#xff0c;堆区存放字符串 初始化 1.字符数组初始化 …

各国家语言代码对照表

来源如下 Language Code Tablehttp://www.lingoes.cn/zh/translator/langcode.htm 详情如下 语言代码语言名称af南非语af-ZA南非语ar阿拉伯语ar-AE阿拉伯语(阿联酋)ar-BH阿拉伯语(巴林)ar-DZ阿拉伯语(阿尔及利亚)ar-EG阿拉伯语(埃及)ar-IQ阿拉伯语(伊拉克)ar-JO阿拉伯语(约旦…

万字详解 Linux 网络管理

万字详解 Linux 网络管理1.Linux处理数据包过程2.和网络相关的几个文件说明网卡配置文件ifcfg-*DNS配置文件/etc/resolv.conf&#xff08;CentOS6环境&#xff09;/etc/services3.网络接口配置和主机名ifconfigifcfghostname命令4.网关/路由5.网关/路由相关命令route命令配置永…

netty(1):NIO 基础之三大组件

1 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 stream 要么是输入&#xff0c;要么是输出&…

如何用idea快速的debug本地程序

介绍大家都经常用idea开发, 开发过程中运行程序就会出现各种意料之外的异常, 如果解决这些异常, 尤其是三方jar包抛出的异常,就是一个很关键和棘手的问题.配置环境在第一个选项位置点开后会弹出配置页面,里面可以配置一些启动需要的环境变量.第二个是debug启动按钮第三个是程序…

SQL 优化方案(规范)

SQL优化1、SQL执行顺序2、前置条件2.1、使用explain分析SQL执行计划2.2、开启慢sql日志2.3、慢查询时间设置。默认情况下long_query_time的值为10秒&#xff0c;可以使用命令修改&#xff0c;也可以在my.cnf参数里面修改。3、基础Sql优化3.1、小表驱动大表3.2、高效的分页3.3、…

【linux入门】Linux基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell&#xff08;Xshell替代品&#xff09;【第二章-Linux基础命令】1.Linux目录结构2.什么…