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

news2024/11/25 14:28:57

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

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

相关文章

【C++】详解set和map

目录 一、什么是关联式容器及树形结构的关联式容器二、键值对三、set1、什么是set2、set的使用1)set的模版参数列表2)set的构造3)set的迭代器4)set的容量5)set的修改操作 3、multiset的介绍及使用 四、map1、什么是map…

vue3怎么把路由的 # 去掉 ? 为什么用mode: ‘history‘没有生效?

代码完成后 请重启项目 一定要重启! 重启!重启! (没重启项目不生效) 1.找到项目中的路由文件 2.引用vueRouter // vue3 import { createRouter, createWebHistory } from "vue-router";var router crea…

C# 交错数组学习

C# 交错数组是元素为数组的数组。 一个示例; using System;class Program {static void Main(string[] args) {string[][] weeks new string[3][];weeks[0] new string[] { "星期日", "星期一", "星期二", "星期三", &…

R语言学习——线性拟合、检查正态分布、秩和检验、百分比检验、卡方检验、方差检验

test <- read.table(/Users/zhangzhishuai/Downloads/20 lesson20 R相关性检验及线性拟合/BMI.txt, sep \t, header T,row.names 1) test plot(test$weight,test$height) cor(test$weight,test$height) cor.test(test$weight,test$height)# 线性拟合 result lm(height~w…

6月《中国数据库行业分析报告》已发布,首发空间、搜索引擎数据库【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

Python 简易表格数据处理CSV+XLS+XLSX

概述 在实际应用中我们进行数据处理与分析时&#xff0c;往往涉及大量的表格。一般来说&#xff0c;使用Python的专业数据分析处理工具包&#xff0c;完全可以胜任我们的大多数需求&#xff0c;比如NumpyPandas。但是有时候往往我们对表格数据的操作是很简单的&#xff0c;不需…

git常用记录

一些日常使用记录 常用命令 切换分支 在git checkout 分支名查看分支 git branch -r git branch -a //查看所有分支包括本地分支和远程分支合并分支 git merge 来源分支删除分支 git branch -D 分支名 //删除本地分支 git push origin --delete 分支名 //删除远程分支本…

ES6新特性总结

最近&#xff0c;在面试中也是经常被问道ES6关于新特性的面试题&#xff0c;那我也来个总结&#xff0c;记录下。 ES6新特性总结 let、const命令&#xff08;1&#xff09;let&#xff08;2&#xff09;const 模板字符串增强的函数&#xff08;1&#xff09;函数的参数可以设置…

6.4.4 GLSL实现奶牛颜色动态变化

#include <osg/Program> #include <osgDB/ReadFile> #include <osgViewer/Viewer>static const char* vertSource {"varying vec3 normal;\n"//易变量 用于着色器之间的传值"void main()\n""{\n"" normal normalize…

Kscan-简单的资产测绘工具

下载地址&#xff1a;https://github.com/lcvvvv/kscan 简介 &#xff1a; Kscan是一款纯go开发的全方位扫描器&#xff0c;具备端口扫描、协议检测、指纹识别&#xff0c;暴力破解等功能。支持协议1200&#xff0c;协议指纹10000&#xff0c;应用指纹20000&#xff0c;暴力破…

UNI-APP_subNVue原生子窗口使用,web-view层级问题解决

subNVues文档 app-subnvues文档 subNVues开发指南 需求&#xff1a;在pages/cloud_control/index页面使用subNVue原生子窗口 1.pages文件配置 "app-plus": {"bounce": "none","subNVues":[{"id": "control_popup&qu…

Mongodb基础及应用、部署(超详细)

目录 一、简介 二、应用场景 三、概念 四、安装部署 1、关闭防火墙和selinux 2、指定一个进程同一时间最多可开启的文件数 3、用户最多可开启的进程数目 4、安装版本下载地址 5、创建数据目录&#xff0c;日志文件及目录并创建相应配置文件 6、启动MongoDB数据库&#xff0c…

接口自动化你一定能要知道的基本流程和测试思路

接口自动化大致步骤&#xff1a; 1、发送请求 2、解析结果 3、验证结果 定义三个和业务相关的类 1、一个用来封装HTTPclient&#xff0c;用来发送请求 2、解析结果xml的类 3、一个用于比较测试结果和期望值的类&#xff0c;用于验证 4、自动生成报告的类&#xff1a;自…

Nerf-Wild代码学习笔记Neural Radiance Fields for Unconstrained Photo Collections

前言&#xff1a; 本文为记录自己在Nerf学习道路的一些笔记&#xff0c;包括对论文以及其代码的思考内容。公众号&#xff1a; AI知识物语 B站讲解&#xff1a;出门吃三碗饭 本篇文章主要针对其代码来学习其内容&#xff0c;关于代码的理解可能会有出入&#xff0c;欢迎批评指…

如何使用P-One的全链路压测工具来定位问题节点和分析性能问题

首先&#xff0c;简单介绍一下&#xff0c;性能测试平台P-One。 PerformanceOne&#xff08;简称&#xff1a;P-One&#xff09;是泽众软件自主研发的一套一站式性能测试平台软件产品。 该产品采用 B/S 架构开发&#xff0c;实现了集管理、设计、压测、监控以及分析于一体的全方…

(06)ATF代码导读之BL31

代码导读 关于平台相关的代码和函数均以qemu实现解读。 BL31 在BL2中触发安全监控模式调用后会跳转到BL31中执行&#xff0c;同理复位的入口函数为bl31_entrypoint。BL31最主要的两个功能&#xff1a;作为启动流程&#xff0c;初始化硬件和加载BL32、BL31等&#xff1b;启动…

scratch 角色移动

scratch 角色移动 这是本人的第一个scratch程序。入坑scratch是因为希望体验一下图形化编程并制作以动画为主的图形化程序。用的软件是Mind。Mind是由scratch改编的开源IDE&#xff0c;可以图形化开发Arduino程序&#xff0c;本人使用Mind的另一个原因是Mind提供快捷地在OLED屏…

【数据库】MySQL安装(最新图文保姆级别超详细版本介绍)

1.总共两部分&#xff08;第二部可省略&#xff09; 安装mysql体验mysql环境变量配置 1.1安装mysql 1.输入官网地址https://www.mysql.com/ 下载完成后&#xff0c;我们双击打开我们的下载文件 打开后的界面&#xff0c;如图所示 我们选择custom&#xff0c;点击nex…

ModaHub魔搭社区:腾讯云向量数据库为什么以独立产品形式推出?

自今年大模型趋势发生以来&#xff0c;向量数据库领域备受关注。 今年3月以后&#xff0c;多家向量数据库厂商拿下最新融资&#xff0c;其中Pinecone更是获得高达1亿美元的B轮融资。 腾讯云当然也注意到了这一趋势。 腾讯云数据库副总经理罗云表示&#xff0c;当时内部已经开…

华为OD机试真题 Java 实现【网上商城优惠活动(一)】【2022 Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Java算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 某网上商城举办优惠活动&#xff0c;发布了满减、打折、无门槛3种优惠券&#xff0c;分别为&#xff1a; 1.每满100元优惠10元&#xff0c;无使用数限…