C/C++之动态库/静态库的创建及使用

【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用 原文出处: 吴秦的博客    这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。 什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库 阅读详情

我们先来看两个问题:

库是什么?

答:库里面存放的是现成的,写好的,可以复用的代码,我们写的每一个程序都是报了头文件了,这些头文件里面就是一些库函数。

静态库和动态库?

答:首先静态/动态说的是链接方式。
静态链接是在程序编译时将汇编生成的目标文件与引用的库一起链接打包到可执行文件中。
动态链接是在编译时并不会被链接到目标代码中,而是在程序运行时才被载入。

动态库和静态库的区别?

答:对于静态库:
① 静态库对函数库的链接是放在编译时期完成的。
② 程序运行时与函数库再无联系,移值方便。
③ 浪费空间和资源,因为所有相关的目标文件与相关的函数库被链接合成一个可执行文件。
对于动态库:
① 动态库把对一些库函数的链接载入推迟到程序运行的时期。
② 可以实现进程之间的资源共享。(因此动态库也称为共享库)
③ 将一些程序升级变得简单。
④ 甚至可以做到链接载入完全由程序员在程序代码中控制(显式调用)。

那么接下来我们看看在Linux下如何打包动/静态库,以及如何使用!!!


本文所有程序都在CentOS Linux release 7.3.1611运行!

先看看我们的程序文件,我们的程序主要分为四则运算的头文件和定义文件,以及我们的main文件
在这里插入图片描述
arithmetic.c
在这里插入图片描述
arithmetic.h
在这里插入图片描述
main.c
在这里插入图片描述

动态库

首先我们来打包一个动态库, 首先库中存放的是我们的目标文件,将我们生成的目标文件打包。
所以第一步:先生成目标文件:
在这里插入图片描述
在生成动态库这里的目标文件时,我们要注意使用 -fPIC 选项生成位置无关代码。这是为了能在多个应用程序中共享这个共享库。

第二步: 生成动态库
在这里插入图片描述
我们这里使用的是一个 - -share 选项,用于生成动态库,
因为动态库也是一个共享库,所以是share(我猜的,啊哈哈)

此时动态库已经生成了,我们的libmy_ari.so就是我们生成的动态库,其中lib是前缀,.so是后缀,my_ari是我们的动态库名称。

接下来就是使用动态库了:

使用库就很简单了,将我们的main函数生成可执行文件并链接我们生成的动态库。
使用gcc -main.c -o main -l库名称

在这里插入图片描述
欸?!?按照要求链接我们的库了,但是竟然找不到这个库?这是为什么呢?
这是因为我们链接库的默认路径是在/lib64/下的,而我们的库是在我们当前目录下,所以链接不到,这样很简单,我们将我们生成的库放入/lib64/下就行了。

在这里插入图片描述
这样成功链接到我们的动态库,然后生成了可执行文件,我们执行它!!!
在这里插入图片描述
得到我们想要的结果,证明成功连接到我们的库了


动态库我们搞定了,接下来看看静态库是如何生成的!

静态库的生成及使用

第一步:还是生成目标文件
在这里插入图片描述
第二步:我们使用 ar 命令生成我们的静态库:
在这里插入图片描述

此时静态库也已经生成了,我们的libmy_ari.a就是我们生成的动态库,其中lib是前缀,.a是后缀,my_ari是我们的静态库名称。

第三步同样是先把我们的库放入/lib64/下,然后链接即可
在这里插入图片描述

我们这里使用了 cr,cr 是静态库链接器,是用于生成静态库的,其中-c选项是创建静态库,-r是模块替换。
有人可能会想到,gcc不是有一个-static选项吗?这不是链接静态库的吗?

解释一下:因为gcc默认链接的是动态库,如果我们直接使用gcc -static main.c -o main -lmy_ari 也是错误的,因为系统下大部分都是动态库,所以就算我们将生成的静态库放入/lib64/下也是不行的,所以我们使用gcc main.c -o main -lmy_ari 用来指定库的查找路径。(前提是得有静态库)


在这里说下库的后缀:
在Linux下:
  .so 是动态链接库
  .a 是静态链接库
在Windows下
  .dll 是动态链接库
  .lib 是静态链接库

C/C++使用技巧(二十二):再谈C/C++多文件编译生成与调用的静态库/动态库[本文所有源码分享] 参考往期文章: C++使用技巧(十):C++编译生成与调用自定义静态库/动态库 脚本介绍与运行: #.out是可执行文件,相当于win上的exe; #.o是编译中间目标文件,相当于win上的.obj; #.a是静态库,多个.o练链接得到,用于静态链接; #.so是共享库,用于动态链接,相当于win上.dll; # 注意:在用-o和-c的时候, -c不要指定多个文件 #g++ : error : cannot specify -o with -c, -S or -E with multiple files 阅读详情

相关推荐

关于RT-Thread中PWM无法正常输出的学习

按照官方的PWM配置,并没有输出PWM,网上有比较多的办法,试了很多,有些还是不能实现输出,这里做个记录。记录自己完成PWM输出的过程,以及修改的地方。 关于STM32CubeMX配置就不多说了,网上有很多。 首先必定是按照流程来,一定一定按照流程来!!! 需要注意的是加上通道数!!!! 这是流程上没有的,也是RTT的一点小BUG吧 配上board.c中添加的代码,我用的是PA2定时2的通道3,需要使用的朋友修改对应定时器和GPIO! void HAL_TIM_Base_MspInit(TIM_Han

weixin_42566346的博客 3552

C++静态库与动态库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。

qq_54178958的博客 1096

博途 V16(TIA portal V16)安装教程

本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。

lingchen1906的博客 6693

C++静态库与动态库理解、创建、使用(超详细版本)

打开工程“属性面板”è”配置属性”è “C/C++”è” 常规”,在“附加包含目录”属性值中,键入DynamicMath.h 头文件所在目录的路径或浏览至该目录。打开工程“属性面板”è”配置属性”è “C/C++”è” 常规”,在“附加包含目录”属性值中,键入StaticMath.h 头文件所在目录的路径或浏览至该目录。l -l:指定链接时需要的动态库,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a或.so来确定库的名称。l -l:指定链接时需要的动态库。

广西彭于晏的博客 3262

`全网最细!! 入门必看Git教程链接:https://gitee.com/all-about-git`

全网 Git 入门教程 gitee.com。如果显示The requested URL returned error: 403错误,那就表示没有和window本地建立token令牌

qq_37855368的博客 3747

LuaJit分析(十一)去除string.dump函数

因此即使我们的指令顺序被打乱,通过loadfile系统调用,再通过string.dump调用,可以得到字节码文件,再通过与标准的luajit生成的字节码文件比对,即可找出差异所在。Lua脚本中的string.dump函数用于生成字节码文件,根据对 luajit -b命令的分析可以得出,最终dump出字节码文件都是使用的string.dump函数。同时lj_libdef.h和lj_ffdef.h这两个文件都是自动生成的,在msvcbuild.bat中,使用如下命令生成。

a545958498的博客 1131

C++动态链接库的创建及使用

运行时加载:程序运行时动态加载,节省内存。独立更新:更新库无需重新编译主程序。可重用性:由于多个应用程序可以共享一个DLL,因此它们可以共享相同的代码和数据,从而提高了代码的可重用性。节省内存:由于DLL在运行时才加载到内存中,因此它们可以在不占用过多内存的情况下提供所需的功能。稳定性:由于多个应用程序共享相同的DLL,因此如果DLL中的代码或数据发生问题,则可以在一次更新后修复所有使用该DLL的应用程序。

保持分享欲 3214

解放双手!利用海康VM全局脚本+通讯管理打造自动化视觉控制系统

本文深入探讨了如何利用海康VisionMaster(VM)的全局脚本和通讯管理功能,打造高效自动化视觉控制系统。通过全局变量实现数据共享与动态调整,结合多协议通讯管理,提升系统响应速度与智能化水平,适用于工业4.0环境下的复杂视觉检测与决策场景。

weixin_28720573的博客 424

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面。这是静态链接库的一个弊端。 动态链接库有两种加载方式:隐式加载和显示加载。 隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载...

u013407012的专栏 3808

高分创新点!Mamba+CNN结合,发顶会首选!

研究摘要 近期视觉领域涌现CNN与Mamba的融合架构,通过双分支设计互补优势。ConvMamba结合CNN的局部特征提取与Mamba的全局建模能力,在ImageNet分类任务中实现90.2%准确率,推理速度提升1.8倍。医学图像方向,PGM-UNet引入提示引导残差Mamba模块,结合多尺度空洞卷积与KANs,显著提升分割精度;遥感领域CM-UNet通过CSMamba块与多尺度注意力聚合模块,有效捕捉长距离依赖。这些工作表明,跨模态轻量化融合与注意力优化是未来重要方向。

m0_73122726的博客 1010

cesium加载geotiff的 四种方法

本文介绍了在Cesium中加载GeoTIFF数据的两种主要方法。首先解析了核心前置知识,包括坐标系匹配、数据类型区分和性能优化。方法1详细演示了如何将RGB影像GeoTIFF转换为Cesium影像图层,包含从数据解析到Canvas转换的完整代码流程。方法2则针对高程数据(DEM)处理,展示了前端直接解析构建地形网格的方案。文章提供了完整的代码示例和关键实现要点,适用于卫星影像、专题图和数字高程模型等多种GeoTIFF数据类型在三维场景中的可视化需求。

大剑师兰特的GIS世界 392

C++(GCC)生成和使用动态库

使用动态库的好处有以下几点: 1. 节省内存空间:动态库在程序运行时才会被加载,不会像静态库那样在编译时就被全部链接进可执行文件中,因此可以节省内存空间。 2. 便于更新:当动态库更新时,只需要替换动态库文件即可,不需要重新编译整个程序。 3. 提高程序运行效率:由于动态库可以被多个程序共享,因此可以减少内存中的重复代码,提高程序运行效率。 4. 方便程序的开发和维护:动态库可以被多个程序共享,因此可以减少代码冗余,提高代码复用率,方便程序的开发和维护。 5. 支持动态加载。

mahuifa的博客 4907

2024年09月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

小杨购物 【题目描述】 小杨有n元钱用于购物。商品A的单价是a元,商品B的单价是b元。 小杨想购买相同数量的商品A和商品B。 默认小猫角色和白色背景,编写程序请你帮小杨计算出他最多能够购买多少个商品A和商品B。 【输入描述】 新建变量“n”用于存储小杨购物的金额。 新建变量“a”用于存储商品A的价格。 新建变量“b”用于存储商品B的价格。 1≤n,a,b≤100000 如下图所示: 图片 【输出描述】 新建变量“result”用于存储小杨最多购买商品A和商品B的个数。 如下图所示:

人生就是一个不断学习的过程 494

Qt 动态库和静态库的创建与使用

前言 c/c++开发中都会用到动态库和静态库。首先动态库和静态库的区别是什么呢? 简单来讲,静态库,如果某个程序需要调用了一个静态库中的方法,在该程序编译时候会将该静态库一起编译进去,即会直接整合到目标程序中,编译成功的可执行文件可独立运行。静态库的扩展名一般为“.a”或“.lib” 而动态库,某个程序在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用,也就是说可执行文件无法单独运行。 静态库与动态库优缺点大概如下 1、静态库 优点:

kchmmd的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux下C/C++静态库和动态库的创建和使用

参考 Linux编写一个C程序HelloWorld 深入探讨Linux静态库与动态库的详解(一看就懂) Linux下动态库(.so)和静态库(.a) 的区别 Linux动态库的导出控制 Linux动态库的导出控制

beibeix2015的博客 166

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的...

weixin_30315143的博客 645

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

linux系统下C/C++静态库和动态库的制作及使用

一般情况下,为了更好的支持开发,第三方库或者是语言库都必须提供静态库和动态库(eg:C C++等官方库),这是方便程序员根据需求功能进行可执行文件的生成;动态链接使用动态库,而静态链接使用静态库。一般来说,我们gcc编译默认是动态链接的而如果加上-static选项,那么生成的可执行文件将为静态生成;

figting 2565

window/linux下C/C++动态库与静态库的创建与使用

window平台需要借助vs工具 制作方法: 第1步-&gt...

weixin_34232363的博客 217

库文件(动态库和静态库)

1.库文件

YoYuanZhizheng的博客 2568

Linux动态库和静态库

一、源代码的组织 我们通常把公用的自定义函数和类从主程序中分离出来,函数和类的声明在头文件中,定义在程序文件中,主程序中要包含头文件,编译时要和程序文件一起编译。 示例(public.h) /* * 程序名:public.h,公共功能函数声明的头文件,用于测试静态和动态链接 */ #ifndef PUBLIC_H #define PUBLIC_H 1 #include <stdio.h> void func(); // 自定义函数的声明 #endif 示例(public.cp

Hardy20200507的博客 507

Linux下,c++创建并调用静态库和动态库

在C/C++中,使用的大多是系统写好的库文件我们用来调用。也可以使用自己建立的库;有两种库:静态库和动态库。 首先来介绍静态库:事先创建.h文件,用来声明两个函数,分别用于静态库和动态库的调用。 ...

m0_60663280的博客 3306

静态库与动态库混合链接

准备 在linux下,终端完成c/c++的编译运行,如果使用到静态库与动态库,那么如何链接?这里以一个例子来完成讲述。假如当前位于test目录,且有a.h、a.c、b.h、 b.c,以及调用a、b中方法的main.c。 每个文件的内容如下 //a.c文件内容如下 #include<stdio.h> void a(){ printf("The first file a\n"); } ...

acehcl 2318

C/C++的静态库与动态库

C/C++编程中相关文件后缀(以Linux系统下为例): .a: 静态库(archive) .c/.cpp: C/C++源程序 .h/.hpp: C/C++源程序的头文件 .i: 经过预处理后的C/C++源程序 .o: 对象文件 .s: 汇编语言代码 .so: 动态链接库 本质上来说库是一种...

weixin_34138255的博客 195

创建和使用库,包括静态库和动态库(共享库)

在Linux下进行C/C++开发经常要创建和使用库,包括静态库和动态库(共享库)。 静态库文件的扩展名是.a,其命名规则是libxxx.a, 动态库的扩展名是.so,其命名规则是libxxx.so。 静态库和动态库在链接调用的是都是 -lxxx。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。  动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是

志存高远 1892

Linux静态库和动态库

一、源代码的组织 我们通常把公用的自定义函数和类从主程序中分离出来,函数和类的声明在头文件中,定义在程序文件中,主程序中要包含头文件,编译时要和程序文件一起编译。 示例(public.h) #ifndefPUBLIC_H #definePUBLIC_H1 #include<stdio.h> voidfunc();//自定义函数的声明 #endif 示例(public.cpp) /* *程序名:public.cpp,公共功能函数定义的程序文件,用于...

qq_41962968的博客 373
上一篇: 进程的调度算法
下一篇: 生产者消费者模型
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值