静态库:
在程序编译时会被链接到代码中,程序运行时将不再需要静态库。
后缀是lib

静态库的生成:

ar -rc


生成静态库的时候要使用.o文件来进行编译生成

gcc -c print.c -o print.oar -rc libtest.a print.ogcc main.c -L . -ltest -o main

动态库:
在程序编译并不会链接到代码中,而是在程序运行时被载入,动态库又被称为动态链接库,英文简称DLL,DLL是包含可以由多个程序使用的代码和数据的库,DLL是不可执行文件。
前缀

lib

后缀

.so

如何查看一个可执行文件所依赖的库?

ldd + 可执行程序

在linux操作系统下 静态库 linux后缀为.a文件
动态库 linux为.so文件

libhello.so

使用这个动态库,我们直接在makefile文件中 -hello就行.

LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。并不是在编译阶段就起效果

ldd命令:
ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。

动态库的生成与使用

动态库生成:

gcc / g++ -shared : 产生共享库的命令行参数
-fPIC:产生位置无关的代码

我们来制作个动态库
先写个test.c

#include<stdio.h>
int print()
{printf("我是动态库\n");
}
gcc -shared -fPIC test.c -o libtest.so

我们写个测试的代码 main.c

#include<stdio.h>int main()
{print();return 0;
}

此时文件信息

如何让主函数使用这个libtest.so

gcc main.c -L . -ltest-L 指定链接的库文件路径
-l 链接的库文件路径 (去掉了前后缀)

这样就能找到这个动态库进行链接

**问题:**不论将程序依赖的动态库放到哪里程序都能找到自己依赖的动态库
1:将动态库放到可执行程序的目录下
可执行程序会搜索当前目录
2:环境变量

LD_LIBRARY_PATH : 保存动态库的搜索路径

我们来看这个路径下有什么

总结:

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
/home/flf/second_stage_review/D_S_Library

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

解耦:互相的影响不是很大

静态链接:在生成可执行程序的时候,加上-static,将库文件内容编译到可执行程序中
静态库和静态链接有什么关系?
没关系。

动态库不止能动态链接,也可以在编译程序的时候静态链接,同理,静态库不仅仅能静态链接,也可以在编译程序的时候动态链接,生成一个动态链接的可执行程序。

动态库优点:
模块体积几乎不变,当多个模块使用该库时,内存中只存在一份代码。
缺点:代码在单独文件中有零散文件
静态库优点:
代码合并到模块中,无零散文件。
静态库缺点:
模块体积变大,多个模块使用库,内存中存在多份代码。

动态库和静态库的区别相关推荐

  1. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  2. 动态库、静态库、运行时库、引入库之间的区别

    动态库.静态库.运行时库.引入库之间的区别 杂集.捡对口味的看看吧. 转自:http://lingualspark.blog.sohu.com/94785899.html 运行时库:Unix中一个典型 ...

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

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

  4. mingw64下动态库和静态库链接的真正区别和用法(详细)

    笔者一直以来都对mingw64下动态库和静态库链接的真正区别和用法存疑,于是做了一些测试,这篇文章记录了测试过程和测试结果,如果只想知道结果可以跳转到文章末尾 一.准备工作 首先准备三个测试文件 其中 ...

  5. Linux系统中动态库和静态库的区别

    Linux系统中"动态库"和"静态库"那点事儿 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源 ...

  6. Linux动态库和静态库比较

     Linux动态库和静态库比较文件预览 文件目录树如下,如你所见,非常简单.    1. libtest/    2. |-- lt.c    3. |-- lt.h    4. `-- test.c ...

  7. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  8. 动态库和静态库的创建

    库:一组别人实现好的函数接口 1.命名方法  静态库 : libname.a  动态库 : libname.so  注意   :库的名字是name  2.链接动态库和静态库的区别  预处理,编译,汇编 ...

  9. c语言仿ce内存搜索工 源代码_C语言函数库:动态库和静态库优缺点比较

    函数的重要性 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护.我们可以把他们制 ...

  10. 动态库与静态库优缺点比较(转 侵删)

    动态库与静态库优缺点比较 2017-10-09   13:32:01      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效 ...

最新文章

  1. 为什么有些人非技术出身,却能带好团队?
  2. Servlet - HTTP超文本传输协议
  3. etcd分布式之负载均衡
  4. java flex 上传文件_使用Flex和java servlet上传文件
  5. 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制
  6. CSS简介及常用标签及属性
  7. 【PTA天梯赛CCCC -2017决赛L2-4】部落 (25 分)(图染色)
  8. javaweb servlet
  9. 诺微联盟催生智能手机的三足鼎立
  10. 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
  11. SploitFun Linux x86 Exploit 开发系列教程
  12. Android中app的请求抓包工具 Fiddler 详解
  13. 浅谈机器学习中的非线性
  14. 拿webshell的一些姿势
  15. 20款常用的商业智能(BI)工具分享(最新)
  16. 4g网络设置dns地址_上网速度慢,修改一下win10系统的DNS设置,网速飙升
  17. android webview 无法显示图片,Android解决WebView加载微信公众号文章不显示图片
  18. 2021年西式面点师(初级)考试题库及西式面点师(初级)考试试题
  19. ADC基本原理与STM32F030ADC应用
  20. oracle灾备同步_浅析Oracle数据库的三种灾备技术

热门文章

  1. node.js 代码加密
  2. win10系统玩部分老游戏时提示0xc0000022的解决方法.
  3. Linux下redis基本操作
  4. 计算机变异指标可以,变异系数公式_在EXCEL中怎样计算样本标准差和变异系数
  5. 国美云运维自动化实践
  6. struts2与struts1区别二
  7. 分布式web系统架构图及应用架构图
  8. 开源库openhtmltopdf html 转pdf特殊字符适配
  9. qq服务器维护到什么时候,qq扩列功能怎么找不到了2021
  10. 「新组件√」微信小程序图片拖拽排序探索