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

-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.hqwc.cn/news/86944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

局域网远程软件Radmin

Radmin是一个快速且安全的远程控制和远程访问软件,通过它可以就像坐在远程计算机前一样,在远程计算机上工作,并可以从多个位置访问远程计算机。(本例使用的版本是Radmin 3.5) 下载Radmin 3.5安装包。 Radmin 3.5安装…

Android事件分发

Android事件分发是指触摸屏幕的事件分发,在手指触摸屏幕后所产生的一系列事件中,典型的事件类型有如下几种: MotionEvent.ACTION_DOWN ——手指刚接触屏幕MotionEvent.ACTION_MOVE——手指在屏幕上面滑动MotionEvent.ACTION_UP——手指从屏幕上松开的一…

2023京东酒类市场数据分析(京东数据开放平台)

根据鲸参谋平台的数据统计,今年7月份京东平台酒类环比集体下滑,接下来我们一起来看白酒、啤酒、葡萄酒的详情数据。 首先来看白酒市场。 鲸参谋数据显示,7月份京东平台白酒的销量为210万,环比下滑约49%;销售额将近19…

【ArcGIS Pro二次开发】(62):复制字段

应网友需求,做了这么一个复制字段的小工具。 假定这样一个场景,手头有一个要素1,要素里有10个字段,另一个要素2,除了shape_area等图形字段外,没有其它字段。 现在的需求是,想把要素1中的8个字…

【C++】list类的模拟实现

🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、list类的模拟实现1.1 list的…

【Leetcode】124.二叉树中的最大路径和(Hard)

一、题目 1、题目描述 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其…

2024年新iPad Pro将实现6年来最大的升级

彭博社的Mark Gurman长期以来一直将iPad Pro的下一次重大更新定在2024年,在最新一期的Power On时事通讯中,他详细阐述了一些细节,这些细节将使其成为“自2018年以来该产品的首次重大更新” 尽管Gurman将最近的iPad升级描述为“最近特别小”&…

Linux之iptables防火墙

目录 一.网络安全技术 二.防火墙 2.1.防火墙分类 2.2.iptables工具简述 2.3.iptables基本语法 2.4.控制类型 2.5.查看规则 2.6.添加规则 2.7.黑白名单 2.8.根据规则编号删除 清空 替换规则 2.9.默认策略 2.10.隐藏扩展模块 2.11.显示扩展模块 三.iptables保存规则…

【多线程】Thread类的用法

文章目录 1. Thread类的创建1.1 自己创建类继承Thread类1.2 实现Runnable接口1.3 使用匿名内部类创建Thread子类对象1.4 使用匿名内部类创建Runnable子类对象1.5 使用lambda创建 2. Thread常见的构造方法2.1 Thread()2.2 Thread(Runnable target)2.3 Thread(String name)2.4 Th…

ReactNative 密码生成器实战

效果展示图 使用插件 Formik 负责表单校验、监听表单提交、数据校验错误信息展示 Yup 负责表单校验规则 分析页面 从上述的展示图我们可以看到的主要元素有:输入框、单选按钮和按钮。其中生成的密码长度不可能很大也不可能为负数和 0,所以我们可以限…

VR智慧课堂 | 临床兽医学VR实验教学有哪些好处?

随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为人们带来了前所未有的体验。在动物医学实验教学中,VR技术的应用也日益受到关注。本文将探讨临床兽医学VR实验教学的好处。 首先,VR技术能够提高动物医学实验的安全性…

跳跃游戏 II【贪心算法】

跳跃游戏 II class Solution {public int jump(int[] nums) {int cur 0;//当前最大覆盖路径int next 0;//下一步的最大覆盖路径int res 0;//存放结果&#xff0c;到达终点时最少的跳跃步数for (int i 0; i < nums.length; i) {//遍历数组&#xff0c;以给出数组以一个…