linux并发服务器 —— 动态库和静态库实战(一)

news2024/11/23 7:10:40

-E 预处理指定源文件

-S 编译指定源文件

-c 汇编指定源文件

-o 生成可执行文件

-I directory 指定Include包含文件的搜索目录

-g 编译的时候生成调试信息

-D 在程序编译时指定一个宏

-w 不生成任何的警告信息

-Wall 生成所有警告

-On n:0~3;表示编译器的优化选项级别 O0 - 不优化;O1 - 缺省值;O3 - 优化级别最高

-l 编译时指定库

-L 编译时指定库的路径

-fpic 生成与位置无关的代码

-shared 生成共享目标文件

-std 指定方言 -std=c++11

gcc编译.c;g++编译.cpp即可

在编译阶段g++会自动调用gcc 二者等价

静态库的制作

库的好处:代码保密;方便部署和分发;

静态库:在程序的链接阶段被复制到程序中

命名规则:linux-libxxx.a;windows-libxxx.lib;lib为前缀,xxx为库名

制作步骤:

1. gcc获得.o文件

2. .o文件用ar工具打包  ar rcs libxxx.a xxx.o xxx.o

 静态库的使用

gcc main.c -o app -I ./include/ -l calc -L ./lib;-I 提供头文件目录,-L 指定库的路径,-l 库的名称

 

动态库的制作与使用

动态库:在链接阶段没有复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用

命名规则:linux - libxxx.so;windows - libxxx.dll;

制作流程:

1. gcc得到.o文件,生成和位置无关的代码(-fpic)

2. gcc得到动态库(-shared)

 动态库加载失败的原因:程序启动时,动态库被动态加载到内存中(使用到动态库中的API时才会加载)。需要ldd检查动态库依赖关系

 需要系统的动态载入器(ld-linux.so)来获取所依赖库的绝对路径,先检查虚拟地址空间、LD_LIBRARY_PATH、/etc/ld.so.cache、/lib/(/user/lib)将动态库加载到内存中;

解决办法:在动态载入器查找范围内,加入动态库即可。

eg. 配置环境变量(LD_LIBRARY_PATH)

 但配置的环境变量是临时了,新开中断没有。永久配置环境变量的方法:1. 用户级别;2. 系统级别

用户级别的配置:在.bashrc中添加上述环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lesson06/library/lib

. .bashrc更新即可;

系统级别的配置:sudo vim/etc/profile

eg. 配置文件列表

通过添加库绝对路径在/etc/ld/so/conf;sudo ldconfig更新即可

eg. 将动态库文件放置在/lib/(/user/lib)下(不建议,可能会替换系统本身的文件)

静态库的优缺点

+ 静态库被打包到应用程序中加载速度快

+ 发布程序无需提供静态库,移植方便

- 消耗系统资源、更新内存

- 更新、部署、发布麻烦

动态库的优缺点

+ 进程间资源共享(共享库)

+ 更新、部署、发布简单

+ 可控制加载动态库的时间

- 加载速度慢

- 发布程序需要提供依赖的动态库

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

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

相关文章

Kubernetes(K8S)使用PV和PVC做存储安装mysql

Kubernetes使用PV和PVC做存储安装mysql 环境准备什么是PV和PVC环境准备配置nfs安装nfs配置nfs服务端 创建命名空间配置pv和pvcpv的yaml文件pvc的yaml文件 部署mysql创建mysql的root密码的secret创建mysql部署的yaml部署mysql链接mysql外部链接内部链接 环境准备 首先你需要一个…

【路由器】小米 WR30U 解锁并刷机

文章目录 解锁 ssh环境准备解锁过程 刷入 mt798x uboot简介刷入流程 刷入 ImmortalWrt简介刷入流程 刷为原厂固件参考资料 本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程,整体步骤与 一般安装流程 类似,但是由于 WR30U 的解锁 ssh 和刷机的过程中…

Docker打包JDK20镜像

文章目录 Docker 打包 JDK 20镜像步骤1.下载 jdk20 压缩包2.编写 dockerfile3.打包4.验证5.创建并启动容器6.检查 Docker 打包 JDK 20镜像 步骤 1.下载 jdk20 压缩包 https://www.oracle.com/java/technologies/downloads/ 2.编写 dockerfile #1.指定基础镜像,并…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型,JAVA 定义实体类 Id Long id 2、查询数据库,此数据存在 3、使用 shell 查询,查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决(一) long 在 mongo中为 int64 类型…

ARM-汇编指令

一,map.lds文件 链接脚本文件 作用:给编译器进行使用,告诉编译器各个段,如何进行分布 /*输出格式:32位可执行程序,小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

ELFNet: Evidential Local-global Fusion for Stereo Matching

论文地址:https://arxiv.org/pdf/2308.00728.pdf 源码地址:https://github.com/jimmy19991222/ELFNet 概述 针对现有立体匹配模型面临可靠性和跨域泛化的问题,本文提出了Evidential Local-global Fusion(ELF)框架&…

十一、内部类(2)

本章概要 为什么需要内部类 闭包与回调内部类与控制框架 继承内部类内部类可以被重写么?局部内部类内部类标识符 为什么需要内部类 至此,我们已经看到了许多描述内部类的语法和语义,但是这并不能同答“为什么需要内部类”这个问题。那么&a…

几个nlp的小项目(文本分类)

几个nlp的小项目(文本分类) 导入加载数据类、评测类查看数据集精确展示数据测评方法设置参数tokenizer,token化的解释对数据集进行预处理加载预训练模型进行训练设置训练模型的参数一个根据任务名获取,测评方法的函数创建预训练模型开始训练本项目的工作完成了什么任务?导…

(AcWing) 任务安排(I,II,III)

任务安排I: 有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。 机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。 从时刻 0 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。 另外&#x…

前端基础之滚动显示

marquee滚动标签 注&#xff1a;该标签已经过时&#xff0c;被w3c弃用!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 使用样例&#xff1a; <marquee>这是个默认的marquee标签</marquee> 多条数据上下滚动&#xff1a; 代码如下&#xff1a; <body><mar…

MySQL每日一练--销售管理系统

一&#xff0c;创建数据库SaleSys 二&#xff0c;在数据库SaleSys中创建3张表 品牌信息表&#xff08;brand&#xff09; BrandId --品牌编号&#xff0c;整型&#xff0c;自动增长&#xff0c;主键BrandName --品牌名称&#xff0c;字符型&#xff0c; 唯一约束 商品表…

DBi Tech Studio Controls for .NET Crack

DBi Tech Studio Controls for .NET Crack Studio Controls for.NET为企业开发人员提供了一套全面的Windows布局和信息表示软件元素&#xff0c;面向搜索业务分析商业调度和UI表示控制器的程序员。Studio Controls for.NET包含17个免版税的.NET Windows窗体控件&#xff0c;用于…

【谷粒商城】开发篇:微服务架构搭建

项目架构搭建 创建代码仓库 步骤一&#xff1a;在gitee中创建代码仓库 步骤二&#xff1a;在IDEA中 clone 项目 clone 结果展示 项目微服务创建 商品服务、仓储服务、订单服务、优惠券服务、用户服务 商品微服务创建 商品微服务创建 使用 Spring Initializr 创建微服务 通过…

Linux:ansible自动化运维工具

环境介绍 当前所有执行权限我是在root下执行的&#xff0c;如果提示权限之类的&#xff0c;可以在每句命令前 加上 sudo ansible主服务器 192.168.0.194 另外两个客户端分别为 192.168.0.193 192.168.0.192 软件只需要在主服务器上安装&#xff0c;客户端不需…

重注微电子产业,“三大齿轮”能否带起香港经济的“第三轮”

文 | 智能相对论 作者 | 佘凯文 众所周知&#xff0c;微电子产业早已成为现代科技领域的关键钥匙&#xff0c;谁能掌握微电子产业&#xff0c;谁就能拥有全球科技领域的话语权。 从上世纪开始&#xff0c;微电子产业曾经历过几次重大转移&#xff0c;如70年代从美国转向日本…

键入网址到网页显示,期间发生了什么?

目录 1.DNS2.可靠传输 —— TCP3.远程定位 —— IP4.两点传输 —— MAC5.出口 —— 网卡6.送别者 —— 交换机&#xff08;可省略&#xff09;7.出境大门 —— 路由器8.数据包抵达服务器后9.响应过程&#xff1a;带有MAC、IP、TCP头部的完整HTTP报文&#xff1a; 1.DNS 客户端…

阿里云故障洞察提效50%,全栈可观测建设有哪些技术要点?

一分钟精华速览 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“以业务为导向”的大前提下&#xff0c;全栈可观测正在成为趋势。…

【项目 计网6】 4.17 TCP三次握手 4.18滑动窗口 4.19TCP四次挥手

文章目录 4.17 TCP三次握手4.18滑动窗口4.19TCP四次挥手 4.17 TCP三次握手 TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的“连接”&#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff…

数据结构入门 — 链表详解_单链表

前言 数据结构入门 — 单链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表 第…

OS 用户级线程

这个程序执行到D&#xff0c;Yield&#xff08;&#xff09;跳到204&#xff0c;然后出栈404出错