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

news2024/12/31 3:44:53

在这里插入图片描述

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


动态库与静态库

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


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


在这里插入图片描述

欢迎关注博主 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.coloradmin.cn/o/484706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SPSS如何进行基本统计分析之案例实训?

文章目录 0.引言1.描述性分析2.频数分析3.探索分析4.列联表分析5.比率分析 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对基本统计…

深度学习卷积神经网络学习小结2

简介 经过大约两周左右的学习,对深度学习有了一个初步的了解,最近的任务主要是精读深度学习方向的文献,由于搭建caffe平台失败而且比较耗费时间就没有再尝试,所以并没有做实践方面的工作,本文只介绍了阅读文献学到的知…

JdbcTemplate常用语句代码示例

目录 JdbcTemplate 需求 官方文档 JdbcTemplate-基本介绍 JdbcTemplate 使用实例 需求说明 创建数据库 spring 和表 monster 创建配置文件 src/jdbc.properties 创建配置文件 src/JdbcTemplate_ioc.xml 创建类JdbcTemplateTest测试是否可以正确得到数据源 配置 J…

《程序员面试金典(第6版)面试题 16.10. 生存人数(前缀和思想)

题目描述 给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果…

Spring源码解读——高频面试题

Spring IoC的底层实现 1.先通过createBeanFactory创建出一个Bean工厂(DefaultListableBeanFactory) 2.开始循环创建对象,因为容器中的bean默认都是单例的,所以优先通过getBean、doGetBean从容器中查找,如果找不到的…

LeetCode-1003. 检查替换后的词是否有效

题目链接 LeetCode-1003. 检查替换后的词是否有效 题目描述 题解 题解一(Java) 作者:仲景 题挺难懂的,很绕,然后读懂了就很简单了 就是说本来是一个字符串s,abc三个字符可以随便放在s原本字符串的左边或…

删除游戏-类似打家劫舍

198. 打家劫舍 - 力扣(LeetCode) 1 熟悉打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被…

java+微信小程序,实现chatgpt聊天小程序

chatgp持续火爆,然鹅会用的人其实挺少的,现在使用异步请求的方式,基本可以实现秒回复。并且还基于webSocket编写了一个微信小程序来进行交互,可以直接使用微信小程序来进行体验。 现在我将所有代码都上传了github(链接在文章结尾),大家可以clone下来,部署到服务器上,真…

shell命令

shell命令 打开文本编辑器(可以使用vi/vim创建文本),新建一个test.sh文件,输入一些代码,第一行为固定写法 #!/bin/bash echo hello word#!是一个约定的标记,他告诉系统这个脚本使用什么解释器执行 shell中注释 1.单行注释使用# 2.多行注释…

在Linux服务器上(非root权限)配置anaconda和pytorch的GPU环境

本人小白一枚,加入了导师的课题组之后使用学校的服务器开始炼丹,但是光是配环境就花了好几天,特此记录下。。。。 选择你趁手的工具 链接远程服务器的终端工具有很多,例如xshell等,我选择是的finalshell 下载教程 【…

敏捷ACP.敏捷估计与规划.Mike Cohn.

第一部分 传统规划失败的原因 vs 敏捷规划有效的原因 传统的项目规划方式往往会让我们失望。要回答-一个 新产品的范围/进度/资源的组合问题,传统规划过程不一定会产生令人非常满意的答案和最终产品。以下- -些论据可以支持这个结论: ●大约2/3的项目会显著超…

Linux设备驱动模型(一)

一、sysfs文件系统 sysfs是一个虚拟文件系统,将内核总的设备对象的链接关系,以文件目录的方式表示出来,并提对设备的供读写接口。 二、kobject kobject是内核中对象表示的基类,可以认为所有的内核对象都是一个kobject kobject单…

Docker 持久化存储 Bind mounts

Docker 持久化存储 Bind mounts Bind mounts 的 -v 与 --mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档:https://docs.docker.com/storage/bind-mounts/ Bind mounts 的 -v 与 --mount 区别 如果使用…

Origin如何使用基础功能?

文章目录 0.引言1.菜单栏2.工具栏 0.引言 因科研等多场景需要进行绘图处理,笔者对Origin进行了学习,本文通过《Origin 2022科学绘图与数据》及其配套素材结合网上相关资料进行学习笔记总结,本文对软件界面基础功能进行阐述。    1.菜单栏 …

【Linux内核解析-linux-5.14.10-内核源码注释】内核源码中宏定义理解

内核宏定义1 这是Linux内核中的start_kernel函数的一部分代码。它的作用是初始化内核的一些基本组件和数据结构。 asmlinkage: 这是一个函数声明修饰符,指示编译器把函数参数放在堆栈中,而不是寄存器中。 __visible: 这是另一个函数声明修饰符&#x…

第二十六章 碰撞体Collision(上)

在游戏世界中,游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如,攻击怪物则是主角与怪物的碰撞,触发机关则是主角与机关的碰撞。在DirectX课程中,我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

生成模型经典算法-VAEGAN(含Python源码例程)

生成模型 文章目录 生成模型1. 概述2. 生成模型典型结构-VAE&GAN2.1 VAE2.1.1 简介2.1.2 模型处理流程 2.2 GAN2.2.1 简介 2.2.2 生成对抗网络要点2.2.3 生成对抗网络的训练准则2.2.4 生成对抗网络模型处理流程 3.生成模型和判别模型在AIGC中的应用3.1 生成模型在AIGC中的应…

【SQL】面试篇之排序和分组练习

1587 银行账户概要 II 1587题目 # Write your MySQL query statement below select name, balance from (select u.account, name, sum(amount) as balancefrom Users uleft join Transactions ton u.account t.accountgroup by u.account ) temp where balance > 10000总…

给定一个文本文件,每行是一条股票信息,写程序提取出所有的股票代码

问题:给定一个文本文件,每行是一条股票信息,写程序提取出所有的股票代码。其中,股票代码规则是:6 位数字, 而且以.SH 或者.SZ 结尾。 文件内容示例: 2020-08-08;平安银行(000001.SZ);15.55;2940…

( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

❓645. 错误的集合 难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了…