首页 > 其他分享 >静态库和动态(共享)库

静态库和动态(共享)库

时间:2024-09-21 23:20:36浏览次数:3  
标签:文件 gcc fun1 fun2 静态 共享 动态

前提要先了解gcc/g++编译器的基本命令

1.库的介绍

1)什么是库
库是二进制文件,是源代码文件的另外一种表现形式,是一些功能相近或相似的函数的集合体。
2)使用库有什么好处

  • 提高代码的可重用性,还可以提高程序的健壮性。
  • 减少开发者的代码开发量,缩短开发周期

3)库制作完成后,如何给用户使用

  • 头文件—包含了库函数的声明
  • 库文件—包含了库文件的代码实现

注意:库不能单独使用,只能作为其他执行程序的一部分完成某些功能,也就是说只能被其他程序调用才能使用。

库可分为静态库(static library)和动态库(shared library)

2.静态库

静态库可以认为是一些目标代码的集合,是在可执行程序运行前就已经加入到执行码中,成为执行程序的 一部分,按照习惯,一般以.a作为文件后缀名
静态库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可,如test
后缀:.a
所以最终的静态库的名字应该为libtest.a

1)静态库的制作
下面以fun1.c,fun2.c和head.h三个文件为例讲述静态库的制作和使用,其中head.h中有函数的声明,fun1.c,fun2.c中有函数的实现

步骤1:将c源文件生成对应.o文件
gcc -c fun1.c fun2.c
或者分别生成.o文件
gcc -o fun1.o -c fun1.c
gcc -o fun2.o -c fun2.c

步骤2:使用打包工具ar将准备好的.o文件打包为.a文件

  • 在使用ar工具的时候需要添加参数rcs
    r 更新 c 创建 s 建立索引
  • 命令:ar rcs 静态库名 .o文件
    ar rcs libtest1.a fun1.o fun2.o
    静态库使用
    2)静态库的使用
    静态库制作完成之后,需要将.a文件和头文件一起发布给用户。
    假设测试文件为main.c,静态库文件是libtest1.a, 头文件为head.h
    用到的参数:
  • -L:指定要链接的库所在目录
  • -l:指定链接时需要的静态库,去掉前缀和后缀
  • -I:指定main.c文件用到的头文件head.h所在的路径
    gcc -o main1 main.c -L ./ -l test1 -I ./
    3)静态库的优缺点
  • 优点:
    函数库最终被打包到应用程序中,实现函数本地化,寻址方便,速度快。
    程序在运行时与库函数再无瓜葛,移植方便。
  • 缺点:
    消耗系统资源较大,每个进程使用静态库都要复制一份,无端浪费内存。

示意图
静态库会给程序的更新、部署和发布带来麻烦。

3.动态库

动态库在程序运行时才加载,当多个程序共用一个动态库的时候就可以节约内存资源。
按照习惯,动态库一般以.so结尾,共享库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可,如test
后缀:.so
最终的静态库的名字应该为:libtest.so
动态库示意图
1)动态库的制作
生成目标文件.o,此时要加编译选项-fpic
gcc -fpic -c fun1.c fun2.c
参数:-fpic创建与地址无关的编译程序(pic,position independent code),目的就是为了动态库能够在多个程序间共享。
生成共享库,此时要加链接器选项:-shared(指定生成动态链接库)
gcc -shared fun1.o fun2.o -o libtest2.so

2)动态库的使用
和静态库的参数相同
gcc -o main2 main.c -L ./ -I test2 -I ./

3)动态库的优缺点

  • 优点
    节省内存
    部署升级更加方便,只需替换动态库即可,然后再重启服务。
  • 缺点
    加载速度比静态库慢
    移植性差

标签:文件,gcc,fun1,fun2,静态,共享,动态
From: https://blog.csdn.net/2301_78826525/article/details/142399316

相关文章

  • 动态规划——问题的特征与求解步骤精解
    动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推的方式去解决。动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子阶段,按顺序求解子阶段。与分治不同的是,在动态规划过程中,前一子问题的解,为后一子问题的求解提供了有用的信息,也就是......
  • 隐私保护体系下网络威胁情报共享的研究现状和方案设计
    来源:http://netinfo-security.org/article/2024/1671-1122/1671-1122-24-7-1129.shtml威胁情报网络威胁情报是关于网络中正在进行的或潜在的恶意活动信息,涵盖但不限于特定的恶意软件样本、恶意IP地址、钓鱼电子邮件信息、黑客组织的入侵行为等内容,对于提前感知预警、防范低于......
  • Java中的动态配置更新:从配置中心到应用热加载的实现
    Java中的动态配置更新:从配置中心到应用热加载的实现大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代微服务架构中,动态配置更新已成为提高系统灵活性和可维护性的关键技术。通过实现配置中心与应用热加载,我们能够在不重启应用的情况下,快速更新配......
  • 2024年最新全国计算机二级WPS学习资料共享(小黑课堂)
    2024年9月份最新的全国计算机二级WPS学习资料共享(小黑课堂)真题视频解析-10套:作业讲解:WPS选择题公共基础讲解:直播课和笔记:获取方式:资料获取链接如下:下载链接:https://mp.weixin.qq.com/s/NaYkzGTALGdcbgd2x81A7Q......
  • centos搭建smb共享服务器
    1.关闭服务器selinux和防火墙2.安装软件包smbayum-yinstallsamba3.创建共享专用帐号并修改密码useradd-s/sbin/nologinliupdbedit-aliu4.修改配置文件/etc/samba/smb.conf,在最后加入:[data]####共享名称path=/data/liu###共享路径writelist=liu###......
  • 基于Vue实现动态组织结构图
    最近一个项目里有个前端绘制家谱图的需求,大概是下面这个样子:组件源码如下<template><tablev-if="treeData.name"><tr><td:colspan="Array.isArray(treeData.children)?treeData.children.length*2:1":class......
  • 【JavaWeb从入门到精通系列】 - JavaSE基础篇(1) - 抽象,静态,单例设计模式
    一、抽象1、存在意义似是而非的,像却又不是;具有某种特征,但不完整。Animal仅是一种会吃会睡的对象,再无其他行为,不够具体,不够完整。程序是用来模拟现实世界,解决实际问题的,现实世界中存在的都是动物具体的子类对象,并不存在动物对象,所以,Animal不应该被独立创建成对象。如何......
  • 地下城游戏--动态规划.路径问题
    地下城游戏题目五步走状态表示转移方程初始化填表顺序返回值代码题目链接题目五步走状态表示根据经验:有两种表示方式:1,以dp[i][j]为终点+巴拉巴拉2,以dp[i][j]位置为起点+巴拉巴拉。我开始写的时候用的第一种方式,结果没有表示出来,第二种方法可以。dp[i][j]表......
  • 帝国CMS副页面如何实现一篇文章多个动态内容页
    信息页:调用一个模板,展示一条帝国cms的信息;副页面:调用另外一个模板,展示同一条帝国cms的信息。第一步:复制文件将e/action/ShowInfo.php文件复制一份,并重命名,比如命名为MoreInfo.php第二步:修改文件打开刚才复制并重命名的文件,并进行修改(1)找到//moreport和//缓存,大约在3......
  • 了解类字段和静态属性
    您好!欢迎阅读这篇关于类字段和静态属性的文章!es15添加了直接在类主体中定义类字段和静态属性的功能。这消除了构造函数初始化属性的需要,从而使代码更清晰、更简洁。这是为了了解这个新功能!1.定义一个类。你需要定义一个类来使用它:classmyclass{}登录后复制2.将属......