什么是链接库 | 动态库与静态库

news/2024/11/15 4:09:04/

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。


动态库与静态库

    • 什么是链接库
    • 静态库
    • 动态库
    • 头文件和库文件
    • 手动添加链接库


专栏:开发工具常见问题及解决方法


什么是链接库

有时候我们对外提供功能的时候,可能不希望对方看到源码,我们就可以制作成库文件,把库文件和头文件给到对方就可以达到提供功能又不暴露源码的目的。链接库就是指将库文件编译后打包为一个二进制文件,这些二进制文件会在程序调用的时候加载到内存中。实际上,一个或多个源文件编译为目标文件后,这个文件中所引用的外部的符号需要通过链接来找到这部分缺失的地址。而链接的方式又分为两种,如果是在生成可执行文件之前就已经把所有的链接操作完成了,这种链接称为静态链接,这种库文件称为静态链接库;如果是在程序执行的时候才进行链接,这种称为动态链接,对应的库文件称为动态链接库。也正因为如此,使用静态库时生成的可执行文件是可以独立运行的,因为他不再需要外部的内容,而动态库编译生成的可执行文件就无法单独运行,因为他在运行时,才会去链接所引用的外部地址。

静态库

静态库会直接加载到代码段,他和所有的目标文件一起链接成可执行文件,生成可执行文件后可以独立运行。但是,正因为静态库会直接加载到内存的代码段,可执行文件的内部都拷贝了所有目标文件和静态库的指令和数据,编译生成的可执行文件会比较大。并且,如果整个系统中有多个链接统一静态库的可执行文件时,每个可执行文件都要拷贝一份静态库的指令和数据,这就造成了空间浪费,因为他们拷贝的数据都是同样的内容。最后,如果一旦静态库文件有代码更新,就需要重新编译链接重新生成整个可执行文件,更新升级麻烦。 在Linux系统中,静态链接库文件的名称通常为 libxxx .a,在Windows系统中,静态链接库文件的后缀名为 .lib。

动态库

其实,动态库这个称呼本身是对Windows平台上动态链接所用的库文件的一种称呼,在Linux下,一般称为共享库。动态库是在运行时加载到内存的共享库段,这样,如果很多程序都要用到静态库的时候,就会节省大量内存,因为它不像静态库那样加载到代码段,而是是在运行时载入内存的共享库段,当多个程序要用到同一个动态库时,所有程序可以共享这个共享库段的指令和数据。动态链接的实现是这样的,在编译时首先由静态链接器将所有的目标文件链接为一个可执行文件,等到程序运行时会将要用到的动态库加载到内存的共享库段,由动态链接器完成可执行文件和动态库文件的链接工作,可以理解为按需载入内存(在需要用到的时候,才会载入内存)。动态库大大方便了程序的升级和更改,只要用新的动态库文件替换旧的动态库文件即可,在运行时,会自动连接新的库文件。但是正因为动态库运行时载入的这个特点,使用动态库的可执行文件在运行时,会略慢一些,但整体来说,运行速度的性能损失,远远小于内存节省带来的收益。 在Linux系统中,动态链接库的名称通常为libxxx.so,在Windows系统中,动态链接库的后缀名为 .dll。GCC编译器在生成可执行文件时,默认会优先使用动态链接库完成链接,如果当前系统环境中没有程序文件所需要的动态链接库,GCC便会选择静态链接库进行静态链接。如果两种库文件都没有找到,则链接失败。

头文件和库文件

我们在发布库文件的同时,要将库文件和头文件一起发布,头文件中存储了变量、函数或者类等这些功能模块的声明部分,库文件中存储了各模块具体的实现部分。也就是说,头文件中定义了调用库文件中功能模块的接口。头文件的存在也实现了这样一种功能,当我们对外提供功能时,可以通过库文件来隐藏源码实现,功能的使用方只需要根据头文件所提供的接口来调用功能模块即可。

手动添加链接库

当使用 GCC 编译和链接程序时,GCC 默认会链接 libc.a 或者 libc.so,但是对于其他的库(例如非标准库、第三方库等),就需要手动添加。通过 GCC -I 选项来指定库名,直接在 -I 后面加库名即可。

正常情况下,我们指定了要使用的库名时,GCC会自动在标准库目录中搜索文件,例如 /usr/lib。但是,如果想链接位于其它目录中的库,比如说我们自己建的库,或者我们要引用别人的库,就需要在编译时显示指定库的路径。
① 像指定普通头文件的路径一样,为GCC显示指定该库文件的完整路径与文件名。

 gcc main.c -o main.out -I /usr/lib/libm.a

② 通过GCC的-L选项,为GCC增加搜索目录:可以使用多个-L选项,或者在一个选项内使用冒号:分割来指定多个搜索路径。

③ 把库文件所在的目录加到环境变量 LIBRARYPATH 中。


在这里插入图片描述
在这里插入图片描述



http://www.ppmy.cn/news/58212.html

相关文章

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤,它可以帮助我们将文本分成一个个词语,以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域,分词都扮演着重要的角色。 目前,常用的分词库包括 jie…

【漏洞复现】Apache Superset 未授权访问漏洞(CVE-2023-27524)

文章目录 前言声明一、Apache Superset 简介二、影响范围三、漏洞复现四、整改建议 前言 Apache Superset 存在未授权访问漏洞,攻击者可利用该漏洞验证和访问未经授权的资源。 声明 本篇文章仅用于漏洞复现与技术研究,请勿利用文章内的相关技术从事非法…

tcpdump使用教程

一、概述 tcpdump是一个功能强大的,用于抓取网络数据包的命令行工具,与带界面的Wireshark一样,基于libpcap库构建。这篇文章主要介绍tcpdump的使用。关于如何使用tcpdump的资料中,最有用的就是tcpdump的两个手册。 tcpdump使用手…

在VM VirtualBox6.1中安装redhat7.3过程实录

最近试用皕杰报表工具,需要把报表部署到linux系统,因而在VM VirtualBox虚拟机上安装linux操作系统,现把过程记录下来,作为今后的备忘。 打开VM VirtualBox虚拟机,见下图: 点击控制菜单选择新建&#xff1…

C#基础(显示转换——>手动处理 强制转换)

括号强转 作用:一般情况下 将高精度的类型强制转换为低精度 语法:变量类型 变量名 (变量类型)变量; 注意:精度、范围 有符号整型 int i 40000;long l 1;i (int)l; 无符号整型 byte b 1; uint ui 1; b (byte)u…

( 字符串) 647. 回文子串 ——【Leetcode每日一题】

❓647. 回文子串 难度:中等 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使…

字节跳动发放年终奖,远超预期~

最近一段时间,国内互联网大厂接连公布年终奖情况,整个后厂村都洋溢在春节般的喜庆气氛里。 虽然由于各种各样的顾虑(主要是人员流失问题),大部分公司都将年终奖发放时间调整到了年中,但好饭不怕晚&#xf…

C语言选择语句

在C语言中,选择语句是程序控制流程的重要部分之一。选择语句可以根据指定的条件进行分支判断,并根据判断结果执行相应的代码。C语言中的选择语句主要包括if语句、if-else语句、nested if语句和switch-case语句。接下来将会对这些语句进行详细介绍。 if语…