Linux基础工具|C/C++编译器:gcc/g++的使用

1.基础使用

gcc是专门用来编译C语言的编译器,而g++是编译C++的编译器(也可以编译C语言,毕竟C++语言兼容C)。Linux下gcc默认使用8字节的指针。

  1. 下载安装:gcc的安装指令“sudo yum install gcc”(在Linux里大部分情况都是默认安装的),g++安装指令“sudo yum install -y gcc-c++”(注意这里是Centos环境,不同的系统环境安装指令可能不同)
  2. 编译代码:“gcc/g++ 源文件名 -o 预生成可执行文件名”即可编译生成二进制的可执行文件(如果没有给可执行文件命名和“-o”选项,则默认生成名字为a.out的可执行文件。其中“-o”选项是给生成的文件重命名的意思)
  3. 运行代码:在生成的可执行文件中(默认生成a.out)使用“./可执行文件名”指令即可运行可执行程序
    在这里插入图片描述

2.gcc的编译细化指令

程序翻译的过程如下:
1.预处理:a.去注释b.宏替换c.头文件展开d.条件编译…
2.编译:C语言->汇编语言
3.汇编:汇编语言->可重定向二进制目标文件
4.链接:将多个“.o/.obj”文件合并->可执行文件/.exe gcc和g++也是遵循上述的顺序的。 有些语言是解释型的,不需要遵循上述规律,对于每个C/C++程序员都应该熟练掌握上述的流程。

对应每个过程,使用gcc会更加清晰明了。

2.1.预处理|生成预处理文件|gcc -E 源文件名 -o 预处理文件名(.i后缀文件)

这个指令就是把源文件转化成预处理后的文件。

在这里插入图片描述

利用vim的“vs”命令同时打开两个文件我们可以发现,main.i文件比main.c文件:注释被去掉了、宏被替换了、多出了头文件的内容、进行了条件编译。

在这里插入图片描述
在这里插入图片描述

2.2.编译|生成汇编文件|gcc -S 预处理文件名 -o 汇编文件名(.s后缀文件)

在这里插入图片描述
在这里插入图片描述

2.3.汇编|生成可重定位目标文件|gcc -c 汇编文件名 -o 可重定位目标文件名(.o后缀文件)

可重定向目标文件里面已经变成了二进制。

在这里插入图片描述
在这里插入图片描述

这个时候还不能完全运行这个文件,还需要经过链接,把库函数的文件链接过来。

2.4.链接|生成可执行文件|gcc 可重定位目标文件名 -o 可执行文件名

在这里插入图片描述

3.动态库/静态库

3.1.动、静态库文件与依赖

在这里插入图片描述

  1. 在Linux下“.so”后缀的文件为动态库,“.a”后缀的文件为静态库。
  2. 在Window下,“.dll”后缀的文件为动态库,“.lib”后缀的文件为静态库。
  3. 使用“file”指令可用于确定给定文件的类型,它通过检查文件的内容和一些元数据来识别文件类型,并输出相应的描述。这里输出了该文件是有动态链接的64位可执行文件(其中中间的libc就是指C的标准库)。
  4. 如果使用ldd则可以查看该文件依赖的动态库(这里是C语言的动态库)。

在user下的include目录下有很多的头文件,但是这些都是头文件,正常情况下C语言是需要把头文件的具体实现(也就是源代码)给出来的,但是C语言采取了库的方式来给出。

3.2.库函数的头文件在Linux的所在目录/usr/include中

在这里插入图片描述

3.3.库函数的动、静态库在Linux的所在目录/usr/lib64中(64位)

在这里插入图片描述

这里就包含了我们需要的各种动、静态库。而我们在写C语言的时候就会把这些库函数的实现也就是静态库和动态库和我们自己的代码链接为一个可执行程序。

3.4.动态链接和静态链接的区别

静态库(Static Library)和动态库(Dynamic Library)是在软件开发中常用的两种库文件形式。它们有以下几个区别:

  1. 链接方式:静态库在编译时将库的代码和应用程序的代码合并成一个可执行文件,应用程序与静态库的代码一起被链接到最终的可执行文件中。动态库在运行时,应用程序通过动态链接加载库文件,应用程序和动态库是分开存储的,运行时动态加载。
  2. 内存占用:每个使用该静态库的可执行文件都包含了静态库的完整副本,这可能导致可执行文件的体积较大。多个应用程序可以共享同一个动态库的实例,因此,动态库不会使每个应用程序的体积增大,而是在内存中共享已加载的动态库。
  3. 更新与维护:静态库的代码发生变化时,需要重新编译和链接应用程序才能体现更新,每个使用静态库的应用程序需要手动更新。当动态库的代码更新时,所有使用该动态库的应用程序可以无需重新编译,直接加载新的动态库即可。
  4. 可移植性:静态库在编译时被链接到应用程序中,因此应用程序与特定平台和编译器绑定,不太容易移植到其他平台。动态库是在运行时加载的,因此可以提供更好的可移植性,同一动态库可以在不同平台上使用,只需确保动态库本身可用。
  5. 总体而言:静态库在可执行文件中包含了所有相关代码,适用于独立部署或者对特定版本的依赖较高的场景。而动态库可以在运行时共享,减少内存占用,适用于多个应用程序共享和灵活更新的情况。选择使用静态库还是动态库取决于项目的需求和考虑的因素。

3.5.制作用于链接的静、动态库

这个可以使用VS2022制作,有的时候我们做好了接口,但是不希望别人看到具体的实现,就可以自己做一个用于链接的静、动态库。关于制作静态库,这里可以看看我的另外一篇博客《C语言静态库的创建和使用》。

3.6.gcc、g++默认形成的可执行程序使用动态链接

如果加上选项“-static”即可生成静态链接的可执行程序,下图可以看出两者大小的区别。

如果你的机器没有办法生成静态库,则需要自己安装,其中C语言静态库安装指令为“sudo yum install -y glibc-static”,C++静态库安装指令为“sudo yum install -y libstdc+±static”,然后在保证语法没有问题的情况下使用“gcc/g++ 源文件名 -o 可执行程序名 -static”即可。

在这里插入图片描述

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

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

相关文章

固态硬盘优化设置

文章目录 前言关闭Windows Search禁用系统保护(不建议)不建议禁用系统保护原因 关闭碎片整理提升固态硬盘速度开启TRIM合理使用固态硬盘的容量正确关机关闭开机自启 前言 提示:这里可以添加本文要记录的大概内容: 电脑配备固态硬…

大数据Doris(五十六):RESOTRE数据恢复

文章目录 RESOTRE数据恢复 一、RESTORE数据恢复原理 二、RESTORE 数据恢复语法 三、RESOTRE数据恢复案例 1、在 Doris 集群中创建 mydb_recover 库 2、执行如下命令恢复数据 3、查看 restore 作业的执行情况 四、注意事项 RESOTRE数据恢复 Doris 支持BACKUP方式将当前…

1.3 Metasploit 生成SSL加密载荷

在本节中,我们将介绍如何通过使用Metasploit生成加密载荷,以隐藏网络特征。前一章节我们已经通过Metasploit生成了一段明文的ShellCode,但明文的网络传输存在安全隐患,因此本节将介绍如何通过生成SSL证书来加密ShellCode&#xff…

BUU [网鼎杯 2020 青龙组]AreUSerialz

BUU [网鼎杯 2020 青龙组]AreUSerialz 先看题目&#xff0c;是个php反序列化。源码如下。 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename; protected $content;function __construct(…

openwrt使用记录

背景&#xff1a; 平时在vmware中做实验时候&#xff0c;经常需要在不同的机器上下载一些github上的项目进行调试&#xff0c;之前解决方案是在路由器层小米ac2100上装openwrt&#xff0c;试用一番发现太卡了。放弃&#xff0c;这次在vmware中安装作为小米ac2100的旁路由 规划…

全新QQ架构的“NT”版来袭

最近&#xff0c;全新发布的"NT"架构的QQ迎来了更新&#xff0c;同时面向用户开放了下载渠道&#xff0c;有些用户戏称为NT为脑瘫版本&#xff08;bushi&#xff09;苏音体验了以后&#xff0c;描述为&#xff1a;清爽简约还很流畅。 先来看看原来的QQ与现在的NT版本…

STM32外设系列—ESP8266(WIFI)

文章目录 一、ESP8266简介二、固件库烧录三、常用AT指令四、访问API4.1 获取IP地址4.2 GET天气信息4.3 访问结果展示 五、实战项目5.1 串口配置5.2 检测WIFI模块连接状态5.3 发送配置指令5.4 解析天气信息 六、成果展示 一、ESP8266简介 ESP8266是嵌入式和物联网开发中常用的模…

【STM32智能车】寻迹模块

【STM32智能车】寻迹模块 寻迹模块 传感器原理接线说明 智能车寻迹是一种机器人控制技术&#xff0c;它通过使用传感器和程序算法&#xff0c;使汽车能够在行驶过程中识别出路径上的黑线&#xff0c;并沿着该线路行驶。 智能车寻迹常用于竞赛或教育用途&#xff0c;可以提高学生…

大模型浪潮下的平台、框架、AI编译器和芯片架构丨2023智源大会精彩回顾

导读 在大模型时代&#xff0c;应该如何组织AI系统使其能力与市场需求对齐&#xff0c;是底层的AI工程师需要不断思考和探讨的话题。围绕这一问题&#xff0c;在2023智源大会AI系统分论坛上&#xff0c;从事AI框架开发、芯片研发和AI编译器优化的专家汇聚在一起&#xff0c;共同…

Java编译器IDE-Java学习帮手(移动端)

应用商店搜索"java" 编码测试 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;public class SplitTime {private static List<Date> dateSplit(Date start…

Java开发框架:Spring介绍

Spring 概述特点Spring 程序遇到的问题与解决概述 Spring 是 Java EE 编程领域中的一个轻量级开源框架,由 Rod Johnson 在 2002 年最早提出并随后创建,目的是解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。其中,轻量级表现在 Spring 是非侵入式的,即开发应用中…

Python安装完成后执行pip命令报错:‘pip‘ 不是内部或外部命令,也不是可运行的程序

解决办法&#xff1a; 已安装pip的情况下&#xff0c;把这个Scripts文件夹的目录添加到Path环境变量即可。   我的电脑 -> 右键 属性 -> 高级系统设置 -> 环境变量 -> path -> 编辑&#xff1a;加入Scripts文件夹的目录    确定即可