gcc及其相关知识

news2025/1/12 1:55:26

目录

gcc工作流程

静态库的生成和使用(该部分使用g++进行代码的编译。 若使用gcc,也类似)

动态库的制作和使用(此处用gcc,g++类似)

        动态库的命名规则

        动态库的制作

        动态库的使用

动态库和静态库的优缺点

        静态库的优点 

        静态库的缺点

        动态库的优点

        动态库的缺点

为什么使用makefile?

gcc工作流程

        1)第一步是先对源代码进行预处理,具体处理如:去掉注释、在使用宏的地方替换具体宏定义的值、将头文件内容展开等。可使用以下代码进行这一步(test.cpp是一个用来测试的c文件)。

gcc test.c -E -o test.i

        2)第二步是对预处理后的源代码进行编译,使其编译为汇编代码。可使用以下代码进行这一步。

gcc test.i -S -o test.s

        3)第三步是对汇编代码进行汇编使其变为机器代码(即0,1)。可使用以下代码进行这一步。

gcc test.s -c test.o

        4)将目标代码与库代码,其他目标代码以及启动代码进行链接,生成最终的可执行程序。

        注意:平常使用如下代码,即按顺序执行上述四步。

gcc test.c -o test

静态库的生成和使用(该部分使用g++进行代码的编译。 若使用gcc,也类似)

        1)生成:使用ar命令及其rcs参数进行生成。比如我有四个文件分别实现了加减乘除,并有一个头文件声明了这四个函数。

        现在要生成一个静态库,如何生成?

第一步先执行:g++ -c add.cpp divide.cpp multiply.cpp substract.cpp

第二步再执行:ar rcs libcal.a add.o divide.o multiply.o substract.o

        即生成了libcal.a这个静态库。其中lib是前缀,而cal是静态库的名字

        

        2)使用:编译某文件时,若使用到该静态库,则使用g++参数的-l 告诉系统静态库的名称,即cal,使用-L参数告诉系统静态库所处的位置,即可。

动态库的制作和使用(此处用gcc,g++类似)

        动态库的命名规则

                1)Linux:libxxx.so

                      lib:前缀(固定)

                      xxx:库的名字,自己起

                      .so:后缀(固定)

                      在Linux下是一个可执行文件

                2)Windows:libxxx.dll

        动态库的制作

                1)gcc得到.o文件,得到和位置无关的代码

gcc -c -fpic/fPIC a.c b.c

                2)gcc得到动态库

gcc -shared a.o b.o -o libcal.so
        动态库的使用

                使用方式和静态库一样,但注意动态库并不是在程序链接阶段进行链接的,而是在程序启动之后动态库被加载到内存,使用的时候会进行动态链接。

                通过ldd(list dynamic dependencies)命令检查动态库的依赖关系。

                注意:在使用前需要将动态库的绝对路径告诉系统,可以通过设置环境变量达到该目的。

静态链接和动态链接

        静态链接和动态链接的区别在于链接的时机不一样,静态链接的链接是在形成可执行文件时,而动态链接的链接是在程序运行期间。但注意,在形成可执行文件时,若发现有调用动态库的函数,则不对这个函数进行重定位,而把这个过程留到装载时再进行。

动态库和静态库的优缺点

        静态库的优点 

                1)在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。

                2)发布程序时无需提供静态库,移植方便。

        静态库的缺点

                1)浪费空间。每个可执行程序都有静态库的副本。

                2)更新不方便。因为每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。

        动态库的优点

                1)省空间。即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多份副本,而是这多个程序在执行时共享同一份副本;

                2)更新方便。更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。

        动态库的缺点

                1)执行速度慢。因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。

                2)发布程序时需要提供动态库,移植不方便。

为什么使用makefile?

        因为makefile降低了程序员的编译工作量(写好makefile文件后,每次编译只需make即可),而且makefile提供了一些机制确保编译能有序执行。

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

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

相关文章

搭建Synopsis 数字IC IDE开发化境

安装平台信息: VMware15.5和centos7 至于为何要选择如上版本和为何不能直接在物理机上安装还不得而知,只是参考网上的文章是这样做的,先照搬过来,在安装操作中慢慢体会。 安装包内容如下: 使用默认配置,一…

CAN总线一些经典的现场故障

本文分析一些经典的CAN总线现场故障。 1、CAN总线的常见故障 CAN总线错误分析与解决 当CAN总线出现故障或数据传输异常时,往往会出现多种奇怪的故障现象,如仪表板显示异常,车辆无法启动,启动后无法熄灭,车辆动力性能下降,某些电控系统功能失等。 这是因为相关数据或信息…

第二十章 重要HL7操作场景 - 传入消息的双 ACK 序列

文章目录 第二十章 重要HL7操作场景 - 传入消息的双 ACK 序列传出消息的双 ACK 序列配置双 ACK 序列 第二十章 重要HL7操作场景 - 传入消息的双 ACK 序列 对于进入Production的消息,双重确认序列的工作原理如下图所示: 客户端应用程序将消息发送到Produ…

【数据结构•堆】轮廓线

题目描述 轮廓线   • 每一个建筑物用一个三元组表示(L, H, R), 表示左边界, 高度和右边界。   • 轮廓线用X, Y, X, Y…这样的交替式表示。   • 右图的轮廓线为: (1, 11, 3, 13, 9, 0, 12, 7, 16,3, 19, 18, 22, 3, 23, 13, 29, 0) 。   • 给N个建筑,求…

项目架构简介

目录 1 单体应用架构 2 垂直应用架构 3 分布式架构 3.1 RPC 3.2 SOA 4 微服务架构 本文介绍后台应用的各种架构,以及各架构的优缺点对比 1 单体应用架构 将所有的代码功能都写在一个项目中(例如:MVC结构,SSM框架),同时打包,同时部署 优点:便于管理,减少开发、维护、运维成…

GPT内功心法:搜索思维到GPT思维的转换

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

2023国赛数学建模C题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

div 中元素居中的N种常用方法

本文主要记录几种常用的div盒子水平垂直都居中的方法。本文主要参考了该篇博文并实践加以记录说明以加深理解记忆 css之div盒子居中常用方法大全 本文例子使用的 html body结构下的div 盒子模型如下&#xff1a; <body><div class"container"><div c…

docker desktop搭建 nginx

【docker 桌面版】windows 使用 docker 搭建 nginx 拉取 nginx 镜像 docker pull nginx运行容器 docker run -d -p 80:8081 --name nginx nginx本地磁盘创建 nginx 目录 D:\DockerRep\nginx复制 docker 中的 nginx 配置文件 查看运行的容器 docker ps -a docker cp 9f0f82d66dd…

点亮你的第一颗Led灯

1、&#x1f4d5;前言 该系列文章用于记录个人学习stm32单片机的过程&#xff0c;全文搭配图文解说&#xff0c;零基础的萌新也能读懂&#xff0c;欢迎指导讨论~ 2、&#x1f4e6;准备材料 2.1、&#x1f4dd;硬件材料清单 面包板1块 PWLINK PowerWriter仿真器1个 杜…

2023/8/12总结

增加了管理员功能点&#xff1a;&#xff08;管理标签和分类&#xff09; 另外加了一个转换成pdf的功能 主要是通过wkhtmltopdf实现的&#xff0c;之前看过很多说用adobe的还有其他但是都没成功。 然后就是在学习websocket和协同过滤算法实现&#xff0c;还只是初步了解了这些。…

【C语言】自定义实现strlen函数的3种方法

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C语言中自定义实现strlen函数的3种方法&#xff0c;如果大家觉得我写的不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 在自定义实现strlen函数之前&#xff0c;我们简单的介绍一下strlen函…

2023 年第八场牛客多校题解

A Alive Fossils 题意&#xff1a;依次举办 n n n 场多校&#xff0c;每场多校有一些出题人。问哪些出题人每场都出题了。 解法&#xff1a;用 set 维护下一直在出题的人即可。 B Bloodline Counter 题意&#xff1a;求 n n n 个点的竞赛图中最大环大小恰好为 k k k 的方…

【国赛清单】2023全国大学生电赛综合测试【总结】

综合测评简介 &#xff08;1&#xff09;综合测评是全国大学生电子设计竞赛评审工作中非常重要的一个环节&#xff0c;是“一次竞赛二级评审”工作中全国专家组评审工作的一部分。 &#xff08;2&#xff09;测试对象为赛区推荐上报全国评奖的优秀参赛队全体队员&#xff0c;…

找不到资产文件project.assets.json

NuGet 在“obj”文件夹中写入名为 project.assets.json 的文件&#xff0c;.NET SDK 使用该文件来获取有关要传递到编译器的包的信息 。 如果在生成过程中找不到资产文件 project.assets.json&#xff0c;则会发生此错误。 1.执行命令的方式解决 点击工具&#xff0c;分别展开命…

实例 -- Loadrunner实现Android / IOS 手机APP压力测试

随着手机APP用户量的增大&#xff0c;大的手机APP一般都需要进行压力测试&#xff0c;这几天用了Loadrunner 12进行了手机APP的压力测试&#xff0c;整理了下&#xff0c;大家可以参考参考怎样给Andorid / IOS手机APP进行压力测试&#xff0c;以下是操作实例。 先前我的一个帖…

论文浅尝 | CI4MRC:基于因果推断去除机器阅读理解中的名字偏差

笔记整理&#xff1a;朱珈徵&#xff0c;天津大学硕士&#xff0c;研究方向&#xff1a;问答 链接&#xff1a;https://aclanthology.org/2023.findings-acl.812/ 动机 机器阅读理解&#xff08;Machine Reading Comprehension&#xff0c;MRC&#xff09;是根据给定的文章回答…

linux 命令- systemctl

systemctl 参数说明 1、使用语法 用法&#xff1a;systemctl [OPTIONS…] {COMMAND} … 2 、参数说明 参数参数说明start立刻启动后面接的unitstop立刻关闭后面接的unitrestart立刻关闭后启动后面接的unit&#xff0c;亦即执行stop再start的意思reload不关闭后面接的unit的…

从零开始实现一个玩具版浏览器渲染引擎

前言 浏览器渲染原理作为前端必须要了解的知识点之一&#xff0c;在面试中经常会被问到。在一些前端书籍或者培训课程里也会经常被提及&#xff0c;比如 MDN 文档中就有渲染原理的相关描述。 作为一名工作多年的前端&#xff0c;我对于渲染原理自然也是了解的&#xff0c;但是…

HCIP学习--BGP1

目录 BGP是什么 AS EGP协议 IGP协议 EGP和IGP的区别 IGP协议追求 EGP协议的追求 BGP协议 BGP的特性 可靠性 可控性强 AS-BY-AS 具有丰富的属性来取代IGP中度量进行选路 默认不被用于负载均衡 不需要周期更新 无类别路径矢量 BGP数据包 Open Keeplive Update…