linux 系统下gcc

news2024/11/23 15:51:36

linux c

gcc

gcc编译可以执行4步骤:预处理、编译、汇编、链接

预处理 gcc -E

hello.c----->hello.i

展开宏、头文件,替换条件编译,删除注释、空行、空白

编译 gcc -S

hello.i------>hello.s

检查语法规范

汇编 gcc -c

hello.s------>hello.o

将汇编指令翻译成机器指令

链接 (无参数)

hello.o----->a.out

数据段合并地址回填

-o不是链接阶段的参数是起名的

image-20230504153351783

  • 编译阶段消耗时间、和系统资源最多

常用参数

-v查看gcc版本号

-version

-I目录指定头文件

当头文件和源码不在一级目录下,就需要指定头文件的位置

hello.c包含hello.h,hello.h在inc目录下

-I放在编译的前面和后面都可以

gcc -I ./inc hello.c -o hello

静态库和动态库

库可以提高程序编写速度,提高效率

静态库

占内存,速度快

使用在对空间要求较低,对时间要求较高的核心程序中(操作系统启动例程)

image-20230504161748254

制作静态库
ar rcs libmylib.a(起名必须以.a结尾,lib开头) file1.o
  1. 将 .c 生成 .o 文件 gcc -c add.c -o add.o
  2. 使用ar工具制作你静态库 ar rcs lib库名.a add.o sub.o div1.o
  3. 编译到可执行文件中:gcc test.c lib库名.a -o a.out
共享库(动态库)

省内存,速度慢

对时间较低,对空间要求较高

image-20230504162327595

制作动态库
  1. 将 .c 生成 .o 文件,需要生成与位置无关的代码(-fPIC)gcc -c add.c -o -fPIC
  2. 使用gcc -shared 制作动态库 gcc -shared lib库名.so add.o sub.o div1.o
  3. 编译可执行程序时指定所使用的动态库. -l ,指定库名,-L,指定库路径 gcc test.c -o a.out -l mymath -L /lib
  4. 运行可执行程序./a.out,出错原因:

​ 链接器: 工作于链接阶段,工作时需要 -l 和 -L

​ 动态连接器: 工作于程序运行阶段,工作时需要提供动态库所在目录位置

image-20230504180108539

要 -l 和 -L

​ 动态连接器: 工作于程序运行阶段,工作时需要提供动态库所在目录位置

[外链图片转存中…(img-Nuy1sGcf-1683213588529)]

静态函数有位置,动态函数没有位置,动态函数的位置取决于@plt,@plt在动态库加载到内存的时候被填充,动态库的函数比自己定义的函数绑定地址的时间比晚,即plt是一个基地址,需要动态库加载到内存才能确定,而调用的函数是相对于动态库的一个偏移地址。而调用函数的绝对地址是plt的基地址加上偏移地址确定的

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

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

相关文章

网络安全行业就职岗位有哪些?

网络安全作为目前最火的行业之一,它的细分方向很多。下面介绍一下网络安全主要的方向岗位有哪些,以及职责是什么? 一、安全规划与设计方向 岗位名称:系统安全需求分析师。 岗位职责:负责对目标对象需要达到的安全目标…

DIN11 FVI频率脉冲信号转电压电流信号隔离转换模块变换器

主要特性 将单位脉冲信号转换成直流电压或电流信号。 精度等级:0.1 级、0.2 级、0.5 级。产品出厂前已检验校正,用户可以直接使用。 国际标准信号输入: 0-5KHz/0-10KHz/1-5KHz等 0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 …

新港转债,百洋转债上市价格预测

新港转债 基本信息 转债名称:新港转债,评级:AA-,发行规模:3.69135亿元。 正股名称:新中港,今日收盘价:8.67元,转股价格:9.18元。 当前转股价值 转债面值 / 转…

Java设计模式-代理模式

简介 代理模式是一种结构型设计模式,它可以让我们通过一个代理对象来访问一个真实的目标对象,从而实现对目标对象的功能扩展或保护。代理模式的主要角色有三个: 抽象主题(Subject):定义了真实主题和代理主…

Prompt 技巧指南-让 ChatGPT 回答准确十倍!

出品人:Towhee 技术团队 作者:张晨 随着 ChatGPT 等大型语言模型 (LLM)的兴起,人们慢慢发现,怎么样向 LLM 提问、以什么技巧提问,是获得更加准确的回答的关键,也由此产生了提示工程这个全新的领域。 提示工…

JavaScript实现输入班级人数和成绩后,输出总成绩、平均成绩、最高分、最低分的代码

以下为实现输入班级人数和成绩输出总成绩、平均成绩、最高分、最低分的代码和运行截图 目录 前言 一、实现输入班级人数和成绩,输出总成绩、平均成绩、最高分、最低分的代码 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有…

JavaWeb《后端内容:1.Tomcat--Servlet--Thymeleaf》

目录 1. 基础概念 1.1 BS架构和CS架构 1.2 Tomcat图解 2.TomCat 2.1 IDEA配置web项目和tomcat 2.2 idea启动TomCat因为端口号失败的问题 3.Servlet使用流程 3.1 Servlet简单图解 3.2 Servlet导入依赖 3.3 编写Servlet和add.html 3.4 试着使用Jdbc和Dao层连接水果库存…

超细Redis(一)

目录 概述 Redis是什么? Redis能干嘛? 特性 如何学习 Linux安装 测试性能 概述 Redis是什么? Redis (Remote Dictionary Server),即远程字典服务 是一个开源使用ANSI C语言编写、支持网络、可基于内存亦可持…

阿里版ChatGPT——通义千问,开箱初体验

所有行业、所有应用、所有服务都值得基于新型人工智能技术重做一遍,在带来创造性客户体验的同时,生产范式、工作范式、生活范式也将发生变化。——阿里集团董事会主席兼CEO 张勇 2023阿里云峰会上,通义千问大语言模型对外发布,宣称…

【语义分割】LinkNet 从0到1 和代码实现

文章目录 前言1.网络结构1.1 网络结构示意图1.2 创建LinkNet模型 2.代码 前言 已经有了U-net了,为什么需要linkNet? unet见这个文章【语义分割】unet结构和代码实现:https://blog.csdn.net/weixin_40293999/article/details/129648032 它引入了resNet&a…

“SDL 入门指南:了解 SDL,快速上手 SDL 的安装和配置”——VS2022

前言 欢迎来到小K的SDL专栏第一小节,本节为大家介绍一下SDL是什么,能做什么,可以在哪些平台运行以及SDL的安装和VS2022配置SDL、导出模板、cmake运行SDL,同时我也会在资源里为大家上传SDL2.26的安装包,为在github上下载…

扫地机洗地机语音芯片ic一体方案 WTV多功能语音芯片

​随着智能家居的快速普及,扫拖一体机语音芯片ic逐渐成为了家庭清洁的必备之物。在智能家居、商业清洁服务、医院清洁服务、办公室清洁等领域得到广泛应用;而语音芯片方案的应用让清洁机器设备使用起来更加方便和智能化。 编辑搜图 目前大多数扫地机厂家…

2023/5/4总结

刷题&#xff1a; 第二周任务 - Virtual Judge (vjudge.net) 这一题用到了素筛,然后穷举即可 #include<stdio.h> #define Maxsize 500000 int a[Maxsize]; long long b[Maxsize]; long long max0; int sushu() {a[0]a[1]0;int i,j,k;for(i2,k0;i<Maxsize;i){if(a[i…

jeecgboot online代码生成 一对多

首先把前后端环境都起起来&#xff0c;此处略 点击online表单开发&#xff0c;设计主附表&#xff0c;表示一对多(一对一)关系&#xff0c;“一”对应主表&#xff0c;“多”对应附表&#xff0c;如图 表设计完成&#xff0c;点击同步可直接在数据库中生成数据表。 附表注意…

卢北辰:数据点亮梦想,能力驱动人生 | 提升之路系列(九)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

今天的事务的基础上继续找出错点

今天的事务的基础上继续找出错点 2023-05-05 08:21:40.362 ERROR 5560 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested…

手机摄影笔记(一)

人像裁剪注意&#xff1a; 不要在人像的脚踝&#xff0c;膝盖&#xff0c;手肘&#xff0c;手腕处进行裁剪&#xff0c;这样会显得残缺&#xff0c;因为这些位置属于转折位置&#xff0c;不光滑的&#xff0c;上下差别很大。而在手臂&#xff0c;大腿等其他地方进行裁剪&#x…

ThingsBoard教程(三八):规则节点解析 筛选脚本 script,路由分支 switch

前言 本篇文件继续介绍规则节点中的 筛选类型的节点, 筛选脚本 script 可以通过js编程,使用消息体中的书籍,来实现返回true或false。 路由分支 switch : 将传入消息路由到一个或多个输出连接。节点执行配置的TBEL(推荐)或返回字符串数组(连接名称)的JavaScript函数。 …

《花雕学AI》30:ChatGPT的资料来源比例排名前20名是什么?

引言&#xff1a;ChatGPT是一款由OpenAI开发的人工智能聊天机器人&#xff0c;它可以回答各种问题&#xff0c;并生成创意内容&#xff0c;如诗歌、故事、代码等。 ChatGPT的核心技术是基于GPT-3.5和GPT-4的大型语言模型&#xff0c;它可以利用从网路上收集的大量文本资料来进行…

《一》Node 基础

Node&#xff1a;是一个基于 V8 引擎的 JavaScript 运行的环境。 V8 引擎可以嵌入到任何 C 应用程序中&#xff0c;无论是 Chrome 浏览器还是 Node&#xff0c;事实上都是嵌入了 V8 引擎来执行 JavaScript 代码的。 Node 架构&#xff1a; 编写的 JavaScript 代码首先经过 V8 引…