C++系统编程篇——linux编译器 gcc/g++(链接动静态库)

linux编译器-gcc/g++

(1)g++安装(gcc一般自带,g++需要下载)

sudo yum install -y gcc-c++

g++ --version

gcc用于编译C语言代码,g++用于编译C++代码

(2)程序翻译过程

选项“-o”是指目标文件

拆分翻译过程

gcc命令

命令说明

说明

预处理

(预处理完C语言程序还是C语言程序)

gcc -E test.c -o test.i

从现在开始进行程序的翻译,预处理完成,就停下

宏替换,去注释,头文件展开,条件编译(ifdef,elif,endif)

编译

(编译完形成的文件就是汇编代码)

gcc -S test.i -o test.s

从现在开始进行程序的编译,编译完成就停下

编译完成后,将C变成汇编语言

汇编

(汇编过程形成的.o文件叫可重定位二进制文件)

gcc -c test.s -o test.o

从现在开始进行程序的翻译,汇编完成就停下

汇编语言编译成为二进制目标文件

链接

(链接的实质就是将我们自己写的程序所形成的.o文件同系统提供的静态库或动态库中的.o文件链接起来形成可执行程序。)

gcc test.o -o my.exe

从现在开始进行程序的链接,形成最终的可执行程序

形成可执行程序

gcc选项记忆:esc(命令中使用到的选项),iso(生成的文件后缀)

在这里涉及到一个重要的概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函 数“printf”了,而这也就是链接的作用

(3)详解链接(动静态库)

①动静态库--what

链接是我们的程序和库结合的过程,这些库是前人已经写好的标准库,可以供我们使用,使开发更加方便,提高开发效率

安装开发环境的时候,其实已经安装了C标准库+C头文件

动静态库其实就是一系列.o文件。

linux环境下:

动态库:.so,用于动态链接

静态库:.a,用于静态链接

windows环境下:

动态库:.dll

静态库:.lib

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件

②动静态库链接--how

a)静态链接

将自己需要的代码直接拷贝到自己的可执行程序中。所以说,允许你进行拷贝的库就叫做静态库,拷贝完以后我的可执行程序就不需要再依赖于库了。linux上,静态库都是默认没有安装的

静态库优缺点

优点就是不需要再依赖于库,程序在同类型平台中都可以直接运行使用。

缺点也是比较明显的,就是可执行程序的体积会比较大,比较占据资源(磁盘资源,网络资源,内存资源)。

如果要使用静态库进行编译生成可执行程序,示例:gcc -o staticfile test.c -static

staticfile --> 生成的可执行程序

test.c --> 运行代码

b)动态链接

允许你进行链接的库就叫做动态库。可执行程序依据编译器所给出的动态库的地址去动态库中找到相应的方法进行链接,这个过程就叫做库调用。找到以后进行函数返回,链接完成后可执行程序就可以运行了。

动态库优缺点

优点就是比较节省资源,不同的程序中不会出现过多重复的代码。

缺点就是一旦库丢失,所有依赖于该库的程序就都不能运行了。

可查看链接指向

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第141题环形链表

题目: 题解: public class Solution {public boolean hasCycle(ListNode head) {if (head null || head.next null) {return false;}ListNode slow head;ListNode fast head.next;while (slow ! fast) {if (fast null || fast.next null) {return…

802.11漫游流程简单解析与笔记_Part3

原定计划在Part3分析ns3的Roaming流程抓包,但ns3并不支持漫游: 看过Part1的应该都知道,标准关联流程是auth*2 associate*2 key*4,但ns3里面没有与auth有关的部分,third脚本里面有cap字段,但无auth也无key&a…

重学Spring总结

1、Spring框架的诞生 文章目录 1、Spring框架的诞生1、BeanFactory 快速入门1.1、BeanFactory完成了loC思想的实现:1)导入Spring相关的依赖:2)定义Uservice接口及其UserviceImpl实现类;3)创建Bean的配置资源文件,文件名最好为&…

图神经网络实战(13)——经典链接预测算法

图神经网络实战(13)——经典链接预测算法 0. 前言1. 链接预测2. 启发式技术2.1 局部启发式技术2.2 全局启发式技术 3. 矩阵分解小结系列链接 0. 前言 链接预测 (Link prediction) 可以帮助我们理解和挖掘图中的关系,并在社交网络、推荐系统等…

K8S - 用kubectl远程访问内网的k8s集群

在之前的文章 K8S - 在任意node里执行kubectl 命令 介绍过, 通过任何node 的主机, 用kubectl 管理集群是很简单 无非就是两个步骤: 下载 k8s master 上的admin.conf在当前主机配置 K8SCONFIG 环境变量指向 下载的config file 其他内网主机也适用 其…

【图书推荐】《分布式数据库HBase案例教程》

本书重点 最后一章HBase项目实战——论坛日志分析,可以作为研究课题和毕业论文素材,值得收藏。 本书配套示例源码、PPT课件、开发环境、教学视频、习题及答案以及其他丰富的教学资源,方便自学。 内容简介 本书定位是HBase从入门到应用的简…

探索智慧机场运营中心解决方案的价值与应用

随着全球航空业的不断发展,机场运营中心的作用日益凸显。智慧机场运营中心解决方案以其高效的管理和智能化的运营模式,成为优化机场运营、提升服务水平的重要工具。本文将深入探讨智慧机场运营中心解决方案的价值与应用,揭示其在机场管理中的…

[大模型]GLM-4-9B-Chat vLLM 部署调用

vLLM 简介 vLLM 框架是一个高效的大型语言模型(LLM)推理和部署服务系统,具备以下特性: 高效的内存管理:通过 PagedAttention 算法,vLLM 实现了对 KV 缓存的高效管理,减少了内存浪费&#xff0…

python脚本打包为exe并在服务器上设置定时执行

python脚本打包为exe并在服务器上设置定时执行 1. Python脚本打包2. 将打包好的Python脚本放入服务器3. 在服务器上设置其定时执行 1. Python脚本打包 首先,下载pyinstaller 键盘winR打开终端,输入命令:pip install pyinstaller,…

nodejs:centos7安装nodejs-v20.14.0

# 升级glibc 请参考【https://blog.csdn.net/chenhz2284/article/details/139584458?spm1001.2014.3001.5502】 # 升级libstdc 请参考【https://blog.csdn.net/chenhz2284/article/details/139584721?spm1001.2014.3001.5502】 # 安装nodejs cd /chz/install/nodejs# 下…

解决Vue项目Network: unavailable的问题

在vscode使用 npm run serve 运行 Vue项目时发现一个问题,项目只能通过Local访问而不能通过Network访问,终端显示如下: 碰到这种情况的解决方法:在环境变量的path中添加“C:\Windows\System32\Wbem” 1.找到“环境变量”&#xf…

达梦数据库搭建守护集群

前言 DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。通过部署 DM 数据守护,可以在硬件故障(如磁盘损坏)、自然灾害(地震、火灾&#xff09…

【python】python 电子产品销售分析可视化(数据集+源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【已解决】chrome视频无法自动播放的问题

问题: 在用datav开发大屏的时候,放了一个视频组件,但是发现视频组件即使设置了自动播放,仍然无法自动播放 原因: 76 以上版本的谷歌浏览器只能在系统静音下自动播放 解决: 音频自动播放浏览器白名单设置&…

幕墙设计乙级资质:企业技术负责人经验与教育背景

幕墙设计乙级资质中,对企业技术负责人的经验与教育背景有着明确的要求。以下是具体的解读: 一、教育背景 企业技术负责人应具备大学本科或以上学历,这是对其基本教育背景的要求。同时,这一学历背景通常需要在建筑、土木工程、结构…

一文细谈SNN的基本数学原理,LIF模型,STDP与STBP学习方法

首先本文是读完 如何看待第三代神经网络SNN?详解脉冲神经网络的架构原理、数据集和训练方法 原创-CSDN博客 一文通俗入门脉冲神经网络(SNN)第三代神经网络-CSDN博客 两篇文章的总结,文章仅用于学习。 本文主要讨论STDP和STBP方法。 我们都知道&…

YoloV9改进策略:Block篇|FFA-Net:用于单图像去雾的特征融合注意力网络(独家原创)

摘要 本文使用FFA-Net的Block改进YoloV9,使用Block替换RepNCSP中的RepNRes,非常简单!Block由卷积、通道注意力、像素注意力组成。结构图如下: 论文翻译:《FFA-Net:用于单图像去雾的特征融合注意力网络》…

夺冠了!U19国足是什么?这场夺冠对于中国足球意味着什么?

夺冠了!U19国足是什么?这场夺冠对于中国足球意味着什么? 在2024年“丝绸之路华山杯”渭南国际足球邀请赛中,中国U19国家男子足球队以出色的表现,力压群雄,最终夺得冠军。这一成绩不仅是对U19国足队员们辛勤…

ROS1配置husky仿真环境遇到的一些问题+方法论

ROS 系列学习教程(总目录) 本文目录 一、问题描述二、问题分析2.1 分析日志2.2 尝试一(失败)2.3 尝试二(成功) 三、husky仿真需要安装的软件包四、总结 - 方法论4.1 文件路径不合法4.2 文件内容不合法4.3 ROS 环境变量4.3.1 方法一…

Spring Boot集成tablesaw插件快速入门Demo

1.什么是tablesaw? Tablesaw是一款Java的数据可视化库,主要包括两部分: 数据解析库,主要用于加载数据,对数据进行操作(转化,过滤,汇总等),类比Python中的Pandas库;数据…