库:

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

如何使用
用户需要同时具有头文件和库。

头文件(相当于说明书的作用,能够知道这个库能干嘛)

制作出来的库(具体的实现,存放.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库引入之动态库静态库(生成和使用)相关推荐

  1. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  2. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  3. cmake 编译 linux 库,使用CMake编译跨平台静态库

    在开始介绍如何使用CMake编译跨平台的静态库以前,先讲讲我在没有使用CMake以前所趟过的坑.由于不少开源的程序,好比png,都是自带编译脚本的.咱们可使用下列脚原本进行编译:linux . / c ...

  4. 【Linux】零基础学习动静态库打包

    文章目录 一.软硬链接 二.动静态库 理解动静态库 静态库的打包使用 静态库打包Makefile编写 动态库的打包使用 动态库打包Makefile编写 对于小版本的理解 总结 一.软硬链接 站在先前的 ...

  5. PHP编译为静态库,Linux下将Tinyxml编译为静态库

    转载请注明来源:Linux下将Tinyxml编译为静态库 一个应用需要在linux服务器上运行,不能保证每个服务器都有应用依赖的库,又懒得每个服务器都去安装下,也不太现实,于是就将应用所用到的库全部编 ...

  6. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  7. c语言makecode头文件,cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...

  8. 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

    文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...

  9. linux平台 一个简单的helloworld静态库的制作与使用

    业务开发使用Go语言,有的时候会引用c的代码,通常以静态库的形式调用,介绍一下linux平台静态库的制作与使用方式: HelloWorld库代码: HelloWorld.c文件 /*** 简单静态库文 ...

最新文章

  1. Debian下使用OpenLDAP 管理端
  2. Spark PersistenceEngine持久化引擎与领导选举代理机制内核原理深入剖析-Spark商业环境实战...
  3. 英语学习笔记2019-10-25
  4. Web 攻击越发复杂,如何保证云上业务高可用性的同时系统不被入侵?| 专家谈...
  5. AC日记——向量点积计算 openjudge 1.6 09
  6. window.open()
  7. PowerDesigner详细安装教程
  8. C语言malloc函数详解
  9. win7 uefi 无法对计算机,U盘UEFI模式无法启动WIN7安装解决教程
  10. 页面加载出现白页是什么原因造成的
  11. 微电影后期制作的流程
  12. python最大公约数计算_Python怎样求得最大公约数
  13. Struck: Structured Output Tracking with Kernels
  14. 猿如意工具-【SwitchHosts】详情介绍
  15. 退出手机QQ依然显示在线
  16. python文本txt词频统计_python实例:三国演义TXT文本词频分析
  17. python3爬虫系列之使用requests爬取LOL英雄图片
  18. matlab-PID
  19. python我的所得税计算器_python实现计算器简易版
  20. Java容器之HashMap源码解析(视频讲解)

热门文章

  1. 学习笔记(52):Python实战编程-Radiobutton
  2. python怎么用lambda和map函数_Python之lambda匿名函数及map和filter的用法
  3. linux 封装python,基于linux下python学习(封装)
  4. BeanFactory和ApplicationContext对比
  5. Python之IO模式 阻塞式io 非阻塞io 多路复用io 异步io 信号驱动io
  6. C#开发移动应用系列(2.使用WebView搭建WebApp应用)
  7. 【C#】解析C#中JSON.NET的使用
  8. Android Listview 性能优化
  9. c#和WIN32 调用
  10. [iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10