linux库引入之动态库静态库(生成和使用)
库:
库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。
如何使用
用户需要同时具有头文件和库。
头文件(相当于说明书的作用,能够知道这个库能干嘛)
制作出来的库(具体的实现,存放.c、.cpp)
静态库:
是在程序执行前(编译)就加入到目标程序中去了。
优点:
1、静态库被打包到应用程序中运行速度快
2、发布程序无需提供静态库,因为已在app中,移植方便
缺点:
1、链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余的拷贝。
2、更新、部署、发布、比较麻烦。
动态库:
是在执行程序时动态(临时)由目标程序去调用
优点:
1、链接时不复制,程序运行时由系统动态加载到内存,供程序使用,系统只加载一次,多个程序可以共用,节省内存。
2、程序升级简单,因为app里面没有源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现了优化,就能加载成功。
缺点:
1、加载速度比静态库慢
2、发布程序需要提供依赖的动态库
静态库的制作和使用
(1)命名规则
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
(2)制作步骤
原材料:源代码.c 或者 .cpp
1、将.c文件生成.o,gcc a.c b.c -c
pi@raspberrypi:~/test$ ls
togetherfunc1.c togetherfunc1.h togetherfunc.c
pi@raspberrypi:~/test$ gcc togetherfunc1.c -c
pi@raspberrypi:~/test$ ls
togetherfunc1.c togetherfunc1.h togetherfunc1.o togetherfunc.c
2、将.o 打包
ar rcs 静态库的名字 原材料
ar rcs libtest.a a.o b.o
pi@raspberrypi:~/test$ ar
//输入指令ar,查看各个参数的功能
ps:以下是一些指令的介绍mv togetherfunc1.c ~//~表示工作目录 将这个.c文件移到工作目录cp ~/togetherfunc1.c .//从工作目录再移到当前文件 mv togetherfunc1.* ~
//将当前文件夹下的以togetherfunc1开头的文件移动到工作目录下。 * 是通配符
代码演示
pi@raspberrypi:~/test$ ls
togetherfunc1.c togetherfunc1.h togetherfunc1.o togetherfunc.c
pi@raspberrypi:~/test$ ar rcs libfunc1.a togetherfunc1.o
pi@raspberrypi:~/test$ ls
libfunc1.a togetherfunc1.c togetherfunc1.h togetherfunc1.o togetherfunc.c
(3)库的使用
若直接-l 编译会报错,因为-l 会优先从/urs/lib 或 /urs/local/lib 中去找,但我们想让它优先从当前路径去找,就要用到-L。
pi@raspberrypi:~/test$ gcc togetherfunc.c -lfunc1
/usr/bin/ld: cannot find -lfunc1
collect2: error: ld returned 1 exit status
应该这样使用:
gcc togetherfunc.c -lfunc1 -L ./ -o mainProstatic
//-l 是指定要用的动态库名称,库名砍头去尾去掉lib和.a
//-L 告诉gcc编译器从-L指定的路径去找静态库。默认先是从/urs/lib 或 /urs/local/lib 中去找,若-L后先从指定的路径去找,找不到再从/urs/lib 或 /urs/local/lib 中去找。
// ./表示当前路径
// -o后是编译后程序的名字
动态库的生成和使用
(1)命名规则
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so”
(2)制作步骤
输入指令:
gcc -shared a.o b.o -o libxxx.so
代码演示:
pi@raspberrypi:~/test $ ls
libfunc1.a togetherfunc1.c togetherfunc1.h
pi@raspberrypi:~/test $ gcc -shared -fpic togetherfunc1.c -o libfun1.so
pi@raspberrypi:~/test $ ls
libfun1.so libfunc1.a togetherfunc1.c togetherfunc1.h
//-shared 的意思是指定生成动态库
// -fpic 标准,fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
(3)动态库的使用
动态库优先从当前路径去找,没找到的话再去/usr/lib/下去找
sudo cp libfun2.so /usr/lib/
//将生成的动态库拷贝到/usr/lib
sudo rm /usr/lib/libfun2.so
//从/usr/lib/中移除刚才移入的动态库
gcc togetherfunc.c -l fun2 -L ./ -o mianPrody//这是编译的时候//运行的时候可能此时会提示No such file or directory,需要进行环境变量的设置
动态库无法加载(引用动态库,怎么指定动态库的位置):
临时设置:
在终端进行:
export LD_LIBRARY_PATH=“动态库的路径”
利用脚本:
vi start.sh
//创建一个.sh文件
export LD_LIBRARY_PATH="/home/pi/test//动态库的路径"
./mianPrody//所要执行的程序名称
//在文件夹中输入以上内容
chmod +x start.sh
//给脚本加可执行的的权限
./start.sh
//执行该脚本
计算文件大小
pi@raspberrypi:~/test $ du libfunc1.a
4 libfunc1.a
pi@raspberrypi:~/test $ du mianPrody
12 mianPrody
linux库引入之动态库静态库(生成和使用)相关推荐
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库
一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...
- cmake 编译 linux 库,使用CMake编译跨平台静态库
在开始介绍如何使用CMake编译跨平台的静态库以前,先讲讲我在没有使用CMake以前所趟过的坑.由于不少开源的程序,好比png,都是自带编译脚本的.咱们可使用下列脚原本进行编译:linux . / c ...
- 【Linux】零基础学习动静态库打包
文章目录 一.软硬链接 二.动静态库 理解动静态库 静态库的打包使用 静态库打包Makefile编写 动态库的打包使用 动态库打包Makefile编写 对于小版本的理解 总结 一.软硬链接 站在先前的 ...
- PHP编译为静态库,Linux下将Tinyxml编译为静态库
转载请注明来源:Linux下将Tinyxml编译为静态库 一个应用需要在linux服务器上运行,不能保证每个服务器都有应用依赖的库,又懒得每个服务器都去安装下,也不太现实,于是就将应用所用到的库全部编 ...
- cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...
CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...
- c语言makecode头文件,cmake 添加头文件目录,链接动态、静态库
罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...
- 头文件和库文件区别,动态库和静态库的区别,动静态库的生成
文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...
- linux平台 一个简单的helloworld静态库的制作与使用
业务开发使用Go语言,有的时候会引用c的代码,通常以静态库的形式调用,介绍一下linux平台静态库的制作与使用方式: HelloWorld库代码: HelloWorld.c文件 /*** 简单静态库文 ...
最新文章
- Debian下使用OpenLDAP 管理端
- Spark PersistenceEngine持久化引擎与领导选举代理机制内核原理深入剖析-Spark商业环境实战...
- 英语学习笔记2019-10-25
- Web 攻击越发复杂,如何保证云上业务高可用性的同时系统不被入侵?| 专家谈...
- AC日记——向量点积计算 openjudge 1.6 09
- window.open()
- PowerDesigner详细安装教程
- C语言malloc函数详解
- win7 uefi 无法对计算机,U盘UEFI模式无法启动WIN7安装解决教程
- 页面加载出现白页是什么原因造成的
- 微电影后期制作的流程
- python最大公约数计算_Python怎样求得最大公约数
- Struck: Structured Output Tracking with Kernels
- 猿如意工具-【SwitchHosts】详情介绍
- 退出手机QQ依然显示在线
- python文本txt词频统计_python实例:三国演义TXT文本词频分析
- python3爬虫系列之使用requests爬取LOL英雄图片
- matlab-PID
- python我的所得税计算器_python实现计算器简易版
- Java容器之HashMap源码解析(视频讲解)
热门文章
- 学习笔记(52):Python实战编程-Radiobutton
- python怎么用lambda和map函数_Python之lambda匿名函数及map和filter的用法
- linux 封装python,基于linux下python学习(封装)
- BeanFactory和ApplicationContext对比
- Python之IO模式 阻塞式io 非阻塞io 多路复用io 异步io 信号驱动io
- C#开发移动应用系列(2.使用WebView搭建WebApp应用)
- 【C#】解析C#中JSON.NET的使用
- Android Listview 性能优化
- c#和WIN32 调用
- [iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10