3---Linux编译器gcc/g++

一、程序的翻译过程:ESc->iso

1.1预处理:c->c

  • 主要功能:宏替换、头文件的展开、条件编译、去注释;目的是让代码变得纯粹。
  • 条件编译,可以实现对代码的裁剪。比如对于不同用户,设置不同的宏常量,条件编译时就会进入不同的分支,裁剪掉未使用的分支。
  • 利用gcc的-E选项,可以让一个.c文件只完成预处理任务。gcc -E hello.c -o hello.i。
  • -o表示目标文件,.i文件是经过预处理的.c文件。

        

1.2编译: c->汇编

  • 主要功能:检查代码的规范性,是否有语法错误。没有的话将代码翻译为汇编语言。
  • 使用gcc的-S选项,可以让一个.i文件只完成编译任务。gcc -S hello.i -o hello.s

        

1.3汇编: 汇编->二进制

  • 主要功能:将.s文件转换为.o文件

        

1.4链接:

  • gcc hello.c -o hello

二、编译器和编程语言

        编译器本质上是一个软件,是由编程语言实现的。所以早期是先有编程语言才有的编译器。早期人和计算机实现交互依靠的是二进制编码。但是二进制效率太低,就发明了汇编语言。计算机依靠由二进制编码实现的编译器,将汇编语言翻译为二进制编码。之后又使用汇编语言实现汇编编译器,将c语言翻译为汇编语言。

三、gcc选项

        

四、动静态库概念和理解:

4.1对开发环境安装的理解:

        安装下载并拷贝头文件和库文件到开发环境中的特定路径下。这个路径一定要可以被编译器自己找到。

4.2程序组成:

        我们的代码+头文件(提供声明)+库文件(提供实现)=我们的可执行程序。

4.3库的命名规则:

  • 库的真正名称,要去掉库的前缀名和后缀。以libc.so.6为例,去掉前缀lib和后缀so.6。这个库的真正名称就是c,即c标准库。
  • 在Linux下,以.so结尾为动态库;以.a结尾为静态库。
  • 在Windows下,以.dll结尾为动态库;以lib结尾为静态库。
  • 静态库数量少于动态库。

4.4共享库:

动态库:

  • 动态链接,是由c/c++或者其他第三方提供的所有方法的集合,被所有的程序以链接的方式联系起来。库中所有的函数都有入口地址,所谓动态链接,就是将要调用的函数在库中的地址拷贝到可执行程序的特定位置。

静态库:

  • 静态链接,是由c/c++或者其他第三方提供的所有方法的集合,就是将要调用的函数在库中的代码拷贝一份到自己的代码中。

4.5动态链接和静态链接的优缺点:

  • 动态链接,形成的可执行程序体积比较小,比较节省资源。但是要去动态库寻址调用,速度稍微慢一点。
  • 静态链接,可以无视库独立运行,因为库中的函数被拷贝了一份放在自己的代码中;但是代码体积太大,浪费资源。
  • gcc默认使用动态链接生成可执行程序,

4.6安装静态库:

  • 默认情况下,不安装静态库。
  • sudo yum install -y glibc.static   安装c语言静态库

        

  • sudo yum install -y glibc-static libstdc++-static   安装c++静态库

        

4.7使用-static指定生成的可执行程序调用静态库。

        

五、自动化构建代码:

5.1所需命令:

  • make/makefile:make是命令,makefile是当前目录下存在的一个具有特定格式的文件。
  • 创建的文件的文件名可以为makefile,也可以是Makefile。

5.2解析:

        

  • 依赖关系:mybin:code.c
  • 以来方法:gcc code.c -o mybin
  • 使用make自动编译当前目录生成可执行文件
  • 直接make会自动使用第一个配置命令
  • make+指定配置指令会调用指定的指令

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解分布式锁

知识点: 单体锁存在的问题: 单体锁,即单体应用中的锁,通过加单体锁(synchronized或RentranLock)可以保证单个实例并发安全 单体锁是JVM层面的锁,只能保证单个实例上的并发访问安全 如果将单…

java JMH 学习

JMH 是什么? JMH(Java Microbenchmark Harness)是一款专用于代码微基准测试的工具集,其主要聚焦于方法层面的基准测试,精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写,他们对 JIT 及…

鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务

在鸿蒙的内核线程就是任务,系列篇中说的任务和线程当一个东西去理解. 一般二种场景下需要切换任务上下文: 在线程环境下,从当前线程切换到目标线程,这种方式也称为软切换,能由软件控制的自主式切换.哪些情况下会出现软切换呢? 运…

【AutoGPT】踩坑帖(follow李鱼皮)

本文写于2024年5月7日 参考视频:AutoGPT傻瓜式使用教程真实体验! 对应文章:炸裂的AutoGPT,帮我做了个网站! 平台:GitPod 云托管服务 原仓库已经改动很大,应使用的Repo为:Auto-GPT-ZH…

应用层协议之 DNS 协议

DNS 就是一个域名解析系统。域名就是网址,类似于 www.baidu.com。网络上的服务器想要访问它,就得需要它对应的 IP 地址,同时,每个域名对对应着一个 / N个 IP 地址(即对应多台服务器)。 因此,为了…

如何编译不同目录下的两个文件

1.直接编译 2.打包成动静态库进行链接

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况?2. 解决方案方法一:使用 fuser 命令方法二: 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时,我们有时会发现虽然没有可见的进程在执行,但GPU资源却意外地被占用。这种情况往往会阻碍…

如何确保UDP文件传输工具有最低稳定的传输速度?

在当前日新月异的数字时代背景下,文件传输工具已经成为我们日常生活与工作中不可或缺的一部分,尤其针对那些频繁涉及即时数据交互与多媒体流通的场景。 UDP协议,以其突出的高速传输与低延迟特性,脱颖而出成为众多用户的首选。不过…

这3种深拷贝实现,你都知道吗?

目录: 1、JSON.parse 2、structuredClone 3、cloneDeep

实习报告怎么写?笔灵AI实习体验报告模版分享:AI产品前端实习生

实习报告怎么写?笔灵AI实习体验报告模版可以帮你 点击即可使用:https://ibiling.cn/scene/inex?fromcsdnsx 下面分享AI产品前端实习生的实习报告 尊敬的导师和领导们:首先,我想对你们表达我的诚挚感谢,感谢你们给我…

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时,避免窗体闪烁的方法: 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先,右键项目,添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…

LeetCode 142.环形链表Ⅱ

题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内…

Windows命令行一键安装、配置WSL的方法

本文介绍在Windows电脑中,通过命令行的方式,快速、方便安装适用于Linux的Windows子系统(Windows Subsystem for Linux,WSL)的方法。 WSL是由微软开发的一项功能,允许在Windows操作系统上运行Linux发行版系统…

Adobe-Premiere-CEP 扩展 入门-视频剪辑-去气口插件-Silence Remover

短视频,这两年比较火,不要再问为什么用Premiere,非常难用,为什么不用某影,某些国内软件非常接地气简单,又例如某音资深的视频短编辑就很好用了。。。 Premiere二次开发调试难,不如自己搞个cons…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞) 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写,安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

学习笔记——字符串(单模+多模+练习题)

单模匹配 Brute Force算法(暴力) 算法思想 母串和模式串字符依次配对,如果配对成功则继续比较后面位置是否相同,如果出现匹配不成功的位置,则j(模式串当前的位置)从头开始,i&…

Qt——信号 和 槽

目录 概述 信号和槽的使用 自定义信号和槽 带参数的信号和槽 概述 在Linux系统中,我们也介绍了信号的产生、信号的检测以及信号的处理机制,它就是系统内部的通知机制,也可以是一种进程间通信的方式。在系统中有很多信号,我们可…

设计模式学习笔记 - 回顾总结:在实际软件开发中常用的设计思想、原则和模式

概述 本章,先来回顾下整个专栏的知识体系,主要包括面向对象、设计原则、编码规范、重构技巧、设计模式五个部分。 面向对象 相对于面向过程、函数式编程,面向对象是现在最主流的编程范式。纯面向过程的编程方法,现在已经不多见了…

数据结构中的栈(C语言版)

一.栈的概念 栈是一种常见的数据结构,它遵循后进先出的原则。栈可以看作是一种容器,其中的元素按照一种特定的顺序进行插入和删除操作。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做…

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时,往该按钮上方添加一个悬浮元素,通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class,才能通过uni.createSelectorQuery来获取每个元素的节点信息; 2. 添加一个与…