热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

动态库和静态库总结

文章目录动静态库概述生成静态库生成动态库使用自己的库动静态库概述静态库(.a)文件:程序在编译链接的时候把库的代码直接链接到可执行文件中,程序运行的时

文章目录

    • 动静态库概述
    • 生成静态库
    • 生成动态库
    • 使用自己的库


动静态库概述

静态库(.a)文件:程序在编译链接的时候把库的代码直接链接到可执行文件中,程序运行的时候就不再需要静态库
动态库(*.so)文件:程序在运行的时候才会链接库的代码。
因此,一个动态库的可执行文件,只需要知道我需要去哪里找哪个函数就好。所以在链接动态库的可执行文件只需要包含一个需要用的函数入口地址的表,在执行的时候再去链接就好。
而链接静态库的可执行文件则在编译链接时,将外部函数所在目标文件的整个机器码放进来。
所以通过链接静态库生成的可执行文件会比通过链接动态库生成的可执行文件大很多。因为需要保存更多的代码。但是通过链接静态库的可执行文件可以直接更简单的移植。而链接动态库的可执行文件需要一直依赖动态库才能运行。也因此动态库链接的可执行文件也就会更小。
同时,动态库只需要一份,就可以给所有的程序使用,会节省大量的磁盘空间。例如:当我们有十个文件用到了同一个库下的一个函数时,如果使用的是静态库。那么这个函数的机器码就会被重复拷贝出十份。而通过动态库链接的可执行程序就不会。 操作系统通过虚拟内存映射,允许物理内存中的一份动态库可以在用到的所有进程中共享。

生成静态库

我们可以通过创建相应的.h文件和.c文件,然后通过通过“ar -rc”命令生成对应的静态库文件,“ar -tv”命令可以查看静态库下的目录列表。
在这里插入图片描述

生成动态库

生成动态库的方法与生成静态库类似。
但是需要注意的是,生成动态库,需要格外增加FPIC 产生位置无关码 ;
“shared”表示生成共享库格式。
在这里插入图片描述

使用自己的库

需要注意, 当我们要使用自己生成的库时,需要在makefile相应的位置增加 -L -I选项。

-L 链接库所在的路径。
-I 链接动态库的名字, (一般库的名称会有三部分 lib + 名称+ 版本号) 这里需要我们去掉前面的lib 和.so后缀即版本号, 即只需要保留“lib”后的,“.so"前即可。

同时,我们运行动态库时,需要

  • 将.so文件文件复制到系统共享库的路径中,一般情况下在 /usr/lib 中,但是这种方法会污染我们的系统库。
  • 我们还可以更改LD_LIBRARY_PATH, 我们可以自己创建一个目录文件,将我们自定义需要用到的外部库全部放在这个目录文件中,然后添加这个目录到LD_LIBRARY_PATH就好了。
  • 在这里插入图片描述

推荐阅读
  • 本文介绍了在Makefile及Android.mk文件中添加打印输出信息的方法,并详细解析了Android编译过程中的关键步骤,包括环境变量的设置与编译脚本的执行。 ... [详细]
  • 本文将探讨如何在一个目录下针对多个源文件编写高效的Makefile,通过实例介绍从基础到高级的Makefile编写技巧。 ... [详细]
  • 本文深入探讨了在安装PostgreSQL数据库系统时,执行Configure、Make及Make Install命令的具体含义与作用。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • QEMU环境下加载首个Linux驱动模块
    本文介绍了如何在Ubuntu 20.04系统上使用QEMU虚拟机加载一个简单的Linux驱动模块。此过程涉及Linux内核4.0版本的配置与编译。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 在Linux系统中,许多应用程序以源代码的形式提供,这给安装带来了挑战。本文旨在介绍一种简化源码软件安装流程的方法,帮助用户更加轻松地完成安装。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中安装 Python 3.7 的步骤,包括编译工具的安装、Python 3.7 源码的下载与编译、软链接的创建以及常见错误的处理方法。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
author-avatar
不乱于心丨不困于丶情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有