lv4 嵌入式开发-9 静态库与动态库的使用

2023-09-15 23:20:45

目录

1 库的概念

2 库的知识

3 静态库特点

4 静态库

4.1静态库创建

4.2 编译生成目标文件 

4.3 创建静态库 hello

4.4 查看库中符号信息

4.5 链接静态库

5 共享库特点

6 共享库

6.1 共享库创建

6.2 编译生成目标文件

6.3 创建共享库 common

6.4为共享库文件创建链接文件    

6.5 编写应用程序

6. 6 编译test.c 并链接共享库libcommon.so

6.7 加载共享库

6.8 如何查看使用了什么库


掌握:库的概念 静态库 静态库创建 链接静态库 共享库 共享库创建 链接共享库 加载共享库

1 库的概念

库是一个二进制文件,包含的代码可被程序调用

标准C库、数学库、线程库……

库有源码,可下载后编译;也可以直接安装二进制包

/lib   /usr/lib

2 库的知识

库是事先编译好的,可以复用的代码。

在OS上运行的程序基本上都要使用库。使用库可以提高开发效率。

Windows和Linux下库文件的格式不兼容

Linux下包含静态库和共享库

3 静态库特点

编译(链接)时把静态库中相关代码复制到可执行文件中

程序中已包含代码,运行时不再需要静态库

程序运行时无需加载库,运行速度更快

占用更多磁盘和内存空间 静态库升级后,程序需要重新编译链接

4 静态库

4.1静态库创建

确定库中函数的功能、接口编写库源码hello.c      

#include  <stdio.h>
void hello(void) {
    printf(“hello  world\n”);
    return;
}

4.2 编译生成目标文件 

$ gcc -c hello.c -Wall

4.3 创建静态库 hello

$ ar -rsv libhello.a hello.o

ar 参数:
c  禁止在创建库时产生的正常消息
r  如果指定的文件已经存在于库中,则替换它
s  无论 ar 命令是否修改了库内容都强制重新生成库符号表
v 将建立新库的详细的逐个文件的描述写至标准输出
q     将指定的文件添加到库的末尾

t  将库的目录写至标准输出 

4.4 查看库中符号信息

查看库中符号信息
     $nm  libhello.a

      hello.o:
      0000000 T  hello
                     U  puts
 nm:显示指定文件中的符号信息
   -a 显示所有符号

4.5 链接静态库

编写应用程序test.c

#include  <stdio.h>

void hello(void);    
int main(){
    hello();
    return  0;
}

编译test.c 并链接静态库libhello.a

$gcc -o test test.c -L. -lhello
$ ./test
hello  world

//-L+库的路径  
//-l+库的文件名

5 共享库特点

编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码

程序不包含库中代码,尺寸小

多个程序可共享同一个库

程序运行时需要加载库

库升级方便,无需重新编译程序

使用更加广泛

6 共享库

6.1 共享库创建

确定库中函数的功能、接口

编写库源码hello.c  bye.c

#include <stdio.h>
void bye(void) {
    printf(“bye\n”);
    return;
}
#include <stdio.h>
void hello(void) {
    printf(“hello  world\n”);
    return;
}

6.2 编译生成目标文件

$ gcc -c -fPIC hello.c bye.c -Wall

-fPIC:生成与位置无关的代码,与静态库代码大小不一样,符号信息不一样

 

6.3 创建共享库 common

$ gcc -shared -o libcommon.so.1 hello.o bye.o

可以不加.1 ,加.1方便创建软链接

6.4为共享库文件创建链接文件    

$ln -s libcommon.so.1 libcommon.so

符号链接文件命名规则

 lib<库名>.so

6.5 编写应用程序

#include <stdio.h>
#include “common.h”  
int  main() 
{
    hello();
    bye();
    return 0;
}

6. 6 编译test.c 并链接共享库libcommon.so

gcc -o test test.c -L. -lcommon

6.7 加载共享库

执行程序,如果出现这个错误,说明没有找到共享库(非常常见的错误)

$ ./test
./test: error while loading shared libraries: libcommon.so
cannot open shared object file : No such file or directory

添加共享库的加载路径的方法

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$./test
hello world       
bye!

为了让系统能找到要加载的共享库,有三种方法 :

1 把库拷贝到/usr/lib和/lib目录下       

cp libcomom.so /usr/lib

2 在LD_LIBRARY_PATH环境变量中添加库所在路径  

 使用export添加路径,上方采用此方法,但是推荐使用绝对路径(但是再打开一个窗口又找不到)

下面介绍第三种方法

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/Desktop

//$LD_LIBRARY_PATH:加这个用于防止把之前定义的环境变量冲掉

3 添加到bashrc

$ vim ~/.bashrc
最后位置添加
export LD_LIBRARY_PATH=/home/linux/Desktop
$ source ~/.bashrc

4 添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新

6.8 如何查看使用了什么库

$ ldd [可执行文件]

缺少库会提示

 

练习:

静态库和动态库都有什么特点?他们的区别是什么?

静态库特点:
编译(链接)时把静态库中相关代码复制到可执行文件中
程序中已包含代码,运行时不再需要静态库
程序运行时无需加载库,运行速度更快
占用更多磁盘和内存空间 静态库升级后,程序需要重新编译链接

动态库特点:
编译(链接)时仅记录用到哪个共享库中的哪个符号,不复制共享库中相关代码
程序不包含库中代码,尺寸小
多个程序可共享同一个库
程序运行时需要加载库
库升级方便,无需重新编译程序
使用更加广泛

他们的区别:
静态库的代码复制到最终可执行文件中,而动态库的代码由操作系统在运行时加载。
静态库使得可执行文件较大,动态库使得可执行文件较小。
静态库的独立性更强,动态库的更新更灵活。
静态库适用于独立部署的应用程序,动态库适用于共享给多个应用程序使用的场景。

更多推荐

Python —— pytest框架

1、认识pytest框架1、搭建自动化框架的思路与流程1、搭建自动化测试框架的思路和流程,任意测试手段流程都是一致的:手工测试、自动化测试、工具测试手工测试:熟悉业务——写用例——执行用例并记录结果——生成测试报告自动化测试:熟悉业务——写自动化用例(来自于手工测试用例,格式转化为代码)——代码表达用例——代码收集测试

LEETCODE 169 189 121 122 55

169多数元素给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。classSolution{public:intmajorityElement(vector<int>&nums){sort(nums.begin(

win10如何把繁体字改成简体字

win10如何把繁体字改成简体字WBOY发布:2023-07-0913:17:05转载3431人浏览过win10客户在开展文字输入的时候遇到了字体变为繁体字的状况,那么如何把繁体字改成简体字呢?是否有快捷键呢?win10繁体字改简体字的快捷键是Ctrl+Shift+F,你也可以在系统的语言设置中进行操作,开启微软拼音的

线性搜索简介

概念:线性搜索(LinearSearch)是一种简单直观的搜索算法,用于在一个未排序或已排序的数组中查找目标元素。它从数组的第一个元素开始逐个比较,直到找到匹配的元素或搜索完整个数组。线性搜索解决的问题是在一个集合中查找特定元素的位置或判断元素是否存在。算法特点:简单直观:线性搜索是一种最基本的搜索算法,易于理解和实现

成都瀚网科技:抖音提供差异化​​亮点!

在抖音平台上,精选联盟是一个专门为优质品牌提供展示和推广机会的合作项目。对于斗店主来说,如何成功对接精选联盟并实现上市是一个重要目标。在这篇文章中,我们将分享一些豆点与精选联盟对接的方法,并提供上币指南。1、提升店铺品质精选联盟注重优质品牌的展示。因此,提升门店品质是成功对接精选联盟的关键。确保店铺拥有良好的信誉、优质

手机悬浮提词器怎么设置?分享三个简单的操作方法

在现代社会中,手机已成为人们生活中必不可少的一部分。随着科技的不断发展,手机的功能也越来越强大,如今手机悬浮提词器已成为许多人工作或学习时必备的工具。下面将分享三个简单的操作方法,帮助大家更好地设置手机悬浮提词器。打开悬浮窗口首先,我们可以在手机中打开书单视频王应用,进入首页后可以看到提词器功能,如果在面对手机发言时不

大模型RLHF算法更新换代,DeepMind提出自训练离线强化学习框架ReST

文章链接:https://arxiv.org/abs/2308.08998大模型(LLMs)爆火的背后,离不开多种不同基础算法技术的支撑,例如基础语言架构Transformer、自回归语言建模、提示学习和指示学习等等。这些技术造就了像GPT-3、PaLM等基座生成模型,在这些基座模型之上,研究人员通过引入人类反馈的强化

【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作

文章目录一、实验目标二、实验要求三、实验内容四、实验步骤一、实验目标熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS目录与文件的创建方法和文件写入到HDFS文件的方法掌握HDFS目录与文件的删除方法掌握查询文件状态信息和目录下所有文件的元数据信息的方法二、实验要求给出主要实验步骤成功的效果截图。要求分别在本

【数字人】1、SadTalker | 使用语音驱动单张图片合成视频(CVPR2023)

SadTalker:使用一张图片和一段语音来生成口型和头、面部视频论文:SadTalker:LearningRealistic3DMotionCoefficientsforStylizedAudio-DrivenSingleImageTalkingFaceAnimation代码:https://github.com/W

计算机视觉与深度学习-卷积神经网络-卷积&图像去噪&边缘提取-卷积与边缘提取-[北邮鲁鹏]

目录标题参考学习链接什么是图像边缘?为什么研究边缘?有哪些边缘种类?表面法向不连续深度不连续表面颜色不连续光照不连续如何检测边缘?图像求导图像梯度图像梯度的方向图像梯度的模噪声的影响噪声影响带来的问题解决办法(先平滑处理)高斯核去噪高斯一阶偏导核高斯核vs高斯一阶偏导核边缘检测目标Canny边缘检测器高斯一阶偏导核卷积

如何从主机环境演变到云原生开发模式?

时代在发展,我们的知识,开发工具,以及相应的环境也随之进步,我们总是会趋向于向好的一面发展,期望我们自身能够更加优秀,更加高效,以及能够给周围的人带来更多的价值那么在我们平日开发过程中,你们的开发模式,以及开发环境是如何演变的呢?如下是我近一两年经历的变化,希望能给你们带来一些思考和收获混沌之初还是主机环境起初在接触g

热文推荐