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

news2024/11/14 15:33:02

目录

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 [可执行文件]

缺少库会提示

 

练习:

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

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

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

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

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

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

相关文章

启动微服务,提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

说明&#xff1a;启动一些微服务后&#xff0c;一直在报下面这个错误&#xff1b; com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not acc…

扩散模型在图像生成中的应用:从真实样例到逼真图像的奇妙转变

一、扩散模型 扩散模型的起源可以追溯到热力学中的扩散过程。热力学中的扩散过程是指物质从高浓度往低浓度的地方流动&#xff0c;最终达到一种动态的平衡。这个过程就是一个扩散过程。 在深度学习领域中&#xff0c;扩散模型&#xff08;diffusion models&#xff09;是深度生…

《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组对角矩阵

《数据结构、算法与应用C语言描述》使用C语言实现二维数组对角矩阵 对角矩阵定义 如下图所示&#xff1a; 代码实现 _9diagonalMatrix.h 模板类 /* Project name : allAlgorithmsTest Last modified Date: 2022年8月13日17点38分 Last Version: V1.0 Descriptions: …

pdf添加水印

给pdf文件添加水印 引入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency>添加水印 package com.it2.pdfdemo02.util;import com.itextpdf.tex…

解决npm install遇到的问题:Error while executing:

目录 一、遇到问题 二、解决办法 三、备用方案 一、遇到问题 npm ERR! Error while executing: npm ERR! D:\IT_base\git\Git\cmd\git.EXE ls-remote -h -t ssh://gitgithub.com/sohee-lee7/Squire.git npm ERR! npm ERR! fatal: unable to access https://github.com/so…

go-GMP和Scheduler

GPM模型 G 待执行的goroutine&#xff0c;结构定义在runtime.g M 操作系统中的线程&#xff0c;它由操作系统的调度器 进行 调度和管理, 结构定义在runtime.m P 处理器&#xff0c;是GM的中间件&#xff0c;它通过一个队列绑定了GM&#xff0c;每个P都有一个局部queue&#x…

【单线图的系统级微电网仿真】基于 PQ 的可再生能源和柴油发电机组微电网仿真(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华硕电脑怎么录屏?分享实用录制经验!

“华硕电脑怎么录屏呀&#xff0c;刚买的笔记本电脑&#xff0c;是华硕的&#xff0c;自我感觉挺好用的&#xff0c;但是不知道怎么录屏&#xff0c;最近刚好要录一个教程&#xff0c;怎么都找不到在哪里录制&#xff0c;有人能教教我吗&#xff1f;” 随着电脑技术的不断发展…

腾讯mini项目-【指标监控服务重构】2023-08-20

今日已办 PPT制作 答辩流程 概述&#xff1a;对项目背景、架构进行介绍&#xff08;体现我们分组的区别和需求&#xff09;人员&#xff1a;小组成员进行简短的自我介绍和在项目中的定位&#xff0c;分工进展&#xff1a;对项目进展介绍&#xff0c;其中a、b两组的区别和工作…

笔试面试相关记录(4)

&#xff08;1&#xff09;实现防火墙的主流技术有哪些&#xff1f; 实施防火墙主要采用哪些技术 - 服务器 - 亿速云 (yisu.com) &#xff08;2&#xff09; char arr[][2] {a, b, c, d}; printf("%d", *(arr1)); 输出的是谁的地址&#xff1f;字符c 测试代码如下…

Vue.js的服务器端渲染(SSR):为什么和如何

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Tomcat服务启动失败:java.lang.OutOfMemoryError: Java heap space

具体报错&#xff1a; java.lang.OutOfMemoryError: Java heap space 报错分析&#xff1a; 这个报错表明Java程序运行时内存不足。Tomcat服务在启动时需要占用一定的内存资源&#xff0c;如果分配的内存不足&#xff0c;就会出现该错误。通常情况下&#xff0c;出现该错误的原…

[maven] maven 创建 web 项目并嵌套项目

[maven] maven 创建 web 项目并嵌套项目 这里主要就创建另外一个 web 项目&#xff0c;并且创建一个 parent 项目比较方便的管理一下两个子项目。 maven web 项目 web 创建和 quickstart 的过程是差不多的&#xff0c;只不过这里换乘 webapp&#xff0c;配置方便的话可以搞的…

Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅

一、项目概述 欢迎来到创意之源&#xff01;我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio&#xff0c;我们实现了绘制贝塞尔曲线的功能&#xff0c;让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习…

VS2015+opencv 3.4.6开发环境

VS2015+opencv 3.4.6开发环境 一、安装包下载二、安装过程三、VS环境配置四、测试一、安装包下载 这里提供两种下载方法:   1. opencv官网   2. csdn资源下载 二、安装过程 2.1 下载opencv-3.4.6 安装包 2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解…

I/O多路复用三种实现

一.select 实现 &#xff08;1&#xff09;select流程 基本流程是&#xff1a; 1. 先构造一张有关文件描述符的表; fd_set readfds 2. 清空表 FD_ZERO() 3. 将你关心的文件描述符加入到这…

天翎知识管理系统:智能化搜索引擎,快速定位知识资源

关键词&#xff1a;知识管理系统、全文检索 编者按&#xff1a;在当今知识经济时代&#xff0c;企业所面临的知识资源越来越丰富&#xff0c;如何高效地管理和利用这些资源成为了一个重要的问题。天翎知识管理系统凭借其智能化搜索引擎&#xff0c;可以帮助企业快速定位知识资源…

论文管理系统设计与实现

毕业论文管理系统的设计与实现 学生&#xff1a; 指导教师&#xff1a; 内容摘要&#xff1a;毕业论文管理系统是典型的MIS信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而…

LeetCode【4. 寻找两个正序数组的中位数】

快乐安康 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 public double findMedianSortedArrays(int[] nums1, int[] nums2) {if (nums1.length &…

干净优雅的做iOS应用内全局交互屏蔽

本文字数&#xff1a;4930字 预计阅读时间&#xff1a;28分钟 01 交互屏蔽的需求 很多应用开发者都会遇到这样一个需求&#xff0c;当程序需要处理某个敏感的核心任务&#xff0c;或者执行某些动画时&#xff0c;需要杜绝一切外部干扰&#xff0c;优先保证任务的完成&#xff0…