Linux拓展:链接库
一.说明
本篇博客介绍Linux操作系统下的链接库相关知识,由于相关概念已在Windows下链接库一文中介绍,本篇博客直接上操作。
二.静态链接库的创建和使用
1.提前看
这里主要介绍的是C语言的链接库技术,而在Linux下实现C语言程序,需要你的虚拟机的WSL具有GCC编译器,如果你不了解,可以看Linux下实现C语言程序
2.静态链接库的创建
前提:准备好要编译的 .c 库文件和 .h 头文件,具体是是什么,请查看Windows下链接库
基本步骤:
- 1.执行
gcc -c myMath.c -o myMath.o文件 - 2.使用ls命令查看上一步是否成功
- 3.使用
ar rcs libmyMath.a myMath.o将所有目标文件打包为一个静态链接库(这里是以一个为例,命令下面介绍) - 4.使用ls命令查看上一步是否成功
没错,就这几步,你就简单的实现 静态链接库的建立了。
3.静态链接库的使用
静态链接库的用法很简单,就是和其它目标文件一起参与链接,最终生成一个可执行文件。
基本步骤:
- 1.同目录下再创建一个 main.c 文件
- 2.利用vim编辑器正常编写代码
- 3.利用gcc编译命令实现编译成.o文件
- 4.开始链接
第四步的链接命令有两种:
gcc -static main.o libmyMath.a -o main <-- 第 1 种gcc main.o -o main -static -lmyMath -L /home/test/myMath <-- 第 2 种
上面两种如果不行,可以使用:
gcc -L /usr/lib main.o libmymath.a -o main
注意:里面的文件名和路径都要改成你自己文件名和路径,即不变色部分需要修改。
4.演示

三.动态链接库的创建与使用
1.提前看
Windows 平台上生成动态链接库时,需要用__declspec(dllexport)显式地“告诉”编译器哪些函数和变量能被外界调用,这些函数和变量的信息(名称、存储位置)保存在引入库文件(.lib)中,而它们的定义保存在动态链接库文件(.dll)中。
与前者不同,Linux 平台上不再需要生成引入库文件,原因很简单,默认情况下动态链接库中定义的所有函数和变量都允许被外界调用。或者说,动态链接库中不仅保存了所有函数和变量的定义,还保存了能被外界调用的所有函数和变量的信息,所以不需要生成引入库文件。
2.动态链接库的建立
前提和静态链接库一样,需要一个.h文件和.c文件
基本步骤:
- 1.执行命令
gcc -shared -fPIC myMath.c -o libmyMath.so - 2.使用ls命令查看上一步结果
有libmyMath.so文件即成功建立
3.动态链接库的使用
基本步骤:
- 1 将 main.c 与 myMath.h 放在同一目录,向 main.c 文件中引入 myMath.h 头文件
- 2.执行
gcc main.c libmymath.so -o main.exe命令 - 3.使用ls命令查看上一步结果结果
4.补充注意
相比之下,你是不是以为和windows相比,Linux下动态链接库既然比静态链接库如此简单,那么你可以试着运行静态链接库和动态链接库最后的可执行文件,你会发现报错:./main.exe: error while loading shared libraries: libmyMath.so: cannot open shared object file: No such file or directory
这是因为执行main.exe文件时,需要调动所有动态链接库及其存储位置,而其中 libmyMath.so 文件的存储位置系统并不直到,有下面几种解决方式:
- 将链接库文件移动到标准库目录下(例如 /usr/lib、/usr/lib64、/lib、/lib64);
- 在终端输入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx,其中xxx为动态链接库文件的绝对存储路径(此方式仅在当前终端有效,关闭终端后无效); - 修改
~/.bashrc或~/.bash_profile文件,即在文件最后一行添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx(xxx为动态库文件的绝对存储路径)。保存之后,执行source .bashrc指令(此方式仅对当前登陆用户有效)。
接下来你重新运行即可成功。
5.演示

四.补充知识点
1.建立动态链接库
使用gcc -shared -fPIC myMath.c -o libmyMath.so命令
gcc 命令中,各个选项的含义是:
- -shared:表示生成动态链接库;
- -fPIC:也可以写成 -fpic,功能是令 GCC 编译器生成动态链接库时,用相对地址表示库中各个函数和变量的存储位置。这样做的好处是,无论动态链接库被加载到内存的什么位置,都可以被多个程序(进程)同时调用;(无论怎样,你都加上)
- -o libmyMath.so:-o 选项用于指定生成文件的名称,此命令最终生成的动态链接库文件的文件名为 libmyMath.so。
Linux 平台上,动态链接库文件的命名格式为 libxxx.so,其中 xxx 部分可以自定义。
2.ar
ar 是一个用于创建静态库的命令行工具。
语法:ar rcs libname.a file1.o file2.o file3.o
其中 libname.a 是要创建的库的名称,.a 表示这是一个静态库文件。
file1.o, file2.o, file3.o 是包含目标代码的文件,你可以指定任意数量的文件来创建库。
r, c, 和 s 选项都是必须的,表示:
r: 将新的目标文件添加到库中或者替换库中已有的同名文件。c: 如果库不存在则创建它。s: 在库中为每个成员生成符号表。
需要注意的是,Linux 平台上静态链接库的名称不是随意的,通常遵循 libxxx.a 格式,xxx 部分可以自定义。
五.动态链接库的显示调用
Linux 平台下,动态加载库的装载、使用、卸载等操作需要借助以下 4 个函数来完成,使用它们时需要引入<dlfcn.h>头文件。
1.dlopen():打开库文件
语法:void *dlopen(const char *filename, int flag);
其中,filename 参数是共享库文件的路径名,可以是绝对路径或相对路径;flag 参数是一个标志位,用于指定 dlopen() 的行为,可以是以下值之一:
RTLD_LAZY:表示在 dlopen() 返回句柄后,只有在需要时才解析符号。RTLD_NOW:表示在 dlopen() 返回句柄前,解析所有符号。RTLD_GLOBAL:表示将库中的符号添加到全局符号表中,以便其他库可以使用这些符号。RTLD_LOCAL:表示不将库中的符号添加到全局符号表中,而是将其限制在当前库中。
成功调用 dlopen() 函数将返回一个非空的句柄,失败则返回 NULL。通过句柄可以使用 dlsym() 函数获取共享库中的符号地址,使用 dlclose() 函数关闭句柄并卸载共享库。
2. dlsym():从库文件中找到要调用的资源
语法:void *dlsym(void *handle, const char *symbol);
其中,handle 参数是由 dlopen() 返回的共享库句柄,symbol 参数是要查找的符号名称(字符串类型),可以是函数名、变量名或其他标识符。
如果成功找到该符号,则 dlsym() 将返回该符号的地址(指向函数或变量的指针)。否则,dlsym() 将返回 NULL。
3. dlclose():关闭打开的库文件
语法:int dlclose(void *handle);
其中,handle 参数是由 dlopen() 返回的共享库句柄。成功调用 dlclose() 函数将返回零,表示函数调用成功。失败则返回非零值,表示出现错误。
4.例子
#include <stdio.h>
#include <dlfcn.h>int main() {// 打开共享库void *handle = dlopen("libmylib.so", RTLD_NOW);if (handle == NULL) {fprintf(stderr, "Error: %s\n", dlerror());return 1;}// 查找符号int (*my_func)(int) = (int (*)(int))dlsym(handle, "my_func");if (my_func == NULL) {fprintf(stderr, "Error: %s\n", dlerror());dlclose(handle);return 1;}// 调用函数int result = my_func(42);printf("Result: %d\n", result);// 关闭共享库int close_result = dlclose(handle);if (close_result != 0) {fprintf(stderr, "Error: %s\n", dlerror());return 1;}return 0;
}
上面的代码打开名为 libmylib.so 的共享库,查找其中名为 my_func 的函数,并调用该函数,最后关闭共享库。这里假设 libmylib.so 中包含一个名为 my_func 的函数,它接受一个 int 类型的参数并返回一个 int 类型的值。
需要注意的是,上面的代码中使用了 dlerror() 函数来获取错误信息。当 dlopen()、dlsym() 或 dlclose() 发生错误时,可以通过调用 dlerror() 函数来获取具体的错误信息。
六.总结
这就是Linux下链接库的知识了,为后面介绍makefile做基础,可以结合windows下链接库一起观看。
相关文章:
Linux拓展:链接库
一.说明 本篇博客介绍Linux操作系统下的链接库相关知识,由于相关概念已在Windows下链接库一文中介绍,本篇博客直接上操作。 二.静态链接库的创建和使用 1.提前看 这里主要介绍的是C语言的链接库技术,而在Linux下实现C语言程序,…...
基于.Net开发的、支持多平台、多语言餐厅点餐系统
今天给大家推荐一套支持多平台、多语言版本的订单系统,适合餐厅、酒店等场景。 项目简介 这是基于.Net Framework开发的,支持手机、平板、PC等平台、多语言版本开源的点餐系统,非常适合餐厅、便利店、超市、酒店等,该系统基础功…...
Windows系统SSL/TLS安全协议介绍
支持安全加密的https底层使用的就是SSL/TLS,在发起https请求之前需要先建立TCP连接,之后再进行SSL/TLS协议协商,协商通过后才能发起https请求。本文将详细介绍SSL/TLS协议相关的内容。 之前在项目中就出现过客户端SSL/TLS版本过低,导致向服务器发起连接时被服务器拒绝的问题…...
ovs-vsctl 命令详解
ovs-vsctl 命令详解 网桥Bridge 创建 Bridge ovs-vsctl add-br br0 删除 Bridge ovs-vsctl del-br br0 列出 Bridge ovs-vsctl list-br 显示详情 ovs-vsctl show 端口 Port 添加端口 ovs-vsctl add-port br0 p1 其中br0 为上面添加的bridge p1可以是物理端口或者vN…...
具备“记忆”功能的VBA目录选择器
大家使用任意一款浏览器(例如:Chrome、Edge)下载文件时,如果【另存为】对话框选择C:\Download,那么下次再次使用【另存为】功能,对话框默认显示C:\Download,而不是根目录。 在VBA开发中调用目录…...
electron入门 | 手把手带electron项目初始化
Electron是一个基于Chromium和 Node.js,可以使用 HTML、CSS和JavaScript构建跨平台应用的技术框架,兼容 Mac、Windows 和 Linux。 目录 1.了解electron 2.开发环境 3.初始化 采坑插曲: 1.了解electron Electron 可以让你使用纯 JavaScrip…...
力扣解法汇总2423. 删除字符使频率相同
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你…...
【超算/先进计算学习】日报8
目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记阶段一阶段二阶段三阶段四 对自己的表现是否满意简述下次计划其他反馈 今日已完成任务列表 超算/高性能计算总结 遇到的问题及解决方案 无 任务完成详细笔记 阶段一 在学习的第一阶段,我们首先对需要…...
《LearnUE——基础指南:上篇—2》——GamePlay架构之Level和World
目录 听说世界是由多个Level组成的 1.2.1 引言 1.2.2 建造大陆(ULevel) 1.2.3构建世界(World) 1.2.4总结 听说世界是由多个Level组成的 1.2.1 引言 上小节谈到Actor和Component的关系,UE利用Actor的概念组成了世…...
IDEA部署tomcat项目
文章目录 只是部署一下看到这里即可war和war exploded的区别warwar exploded update的动作update resourcesupdate classes and resourcesredeployrestart server 解决了拿到了一个tomcat项目后如何将它部署到IDEA里面的问题。 file->open 选中pom.xml并open as project …...
IAM角色
Identity-based policy,它关联到特定的User/Role/Group上,指定这些主体能对哪些资源进行怎样的操作 Resource-based policy,它关联到具体的AWS资源上,指定哪些主体可以对这个资源做怎样的操作 aws受信任关系视为aws服务可以实现&a…...
【VAR | 时间序列】以美国 GDP 和通货膨胀数据为例的VAR模型简单实战(含Python源代码)
以美国 GDP 和通货膨胀数据为例: 1. 数据集 下载数据我们需要从 FRED 数据库下载美国 GDP 和通货膨胀数据,并将它们存储在 CSV 文件中。可以在 FRED 网站(https://fred.stlouisfed.org/)搜索并下载需要的数据。在这里࿰…...
常用的设计模式之二(行为型模式)
文章目录 观察者模式模板模式 观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并进行相应的处理。 观察者…...
MYSQL基本操作(增删改查)
数据库的列类型 int:整型 用于定义整数类型的数据 float:单精度浮点4字节32位 准确表示到小数点后六位 double:双精度浮点8字节64位 char:固定长度的字符类 用于定义字符类型数据&…...
双周赛103(模拟、网格图BFS、树状数组)
文章目录 双周赛103[6406. K 个元素的最大和](https://leetcode.cn/problems/maximum-sum-with-exactly-k-elements/)模拟 [6405. 找到两个数组的前缀公共数组](https://leetcode.cn/problems/find-the-prefix-common-array-of-two-arrays/)模拟 [6403. 网格图中鱼的最大数目](…...
【数据结构】二叉树(详细)
二叉树 1.树1.1定义1.2基本术语1.3树形结构和线性结构1.4树的存储结构1.4.1双亲表示法1.4.2孩子兄弟表示法 2.二叉树2.1定义2.2特殊二叉树2.3性质2.4存储结构2.4.1顺序存储2.4.2链式存储结构 3.二叉树的基本操作3.1前序遍历(先序遍历)3.2中序遍历3.3后序…...
蓝牙耳机哪款性价比高一些?2023年性价比最高的蓝牙耳机推荐
随着科技的进步,蓝牙耳机已然成为我们生活中的一部分,无论是通勤、追剧、运动或者玩游戏,大都会用到蓝牙耳机。那么,哪款蓝牙耳机的性价比高一些?相信大多数人在选择产品的时候,都会看性价比。接下来&#…...
等保2.0存在的问题
等保制度和技术要求 国家信息安全等级保护制度(二级)相关要求包含技术要求和管理要求,技术要求包含:物理安全、网络安全、主机安全、应用安全及数据安全及备份恢复;管理要求包含:安全管理机构、安全管理制度、人员安全管理、系统建设管理、系统运维管理。 一、 技术要求 …...
国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作
IAP升级 Bootloader的制作 1、上节提到Flash的分区,0x8000000-0x8004000为Boot分区,我们的bootloader就烧录到此分区。 Bootloader很简单,新建一个普通的工程, 也不用初始化外部设备,开机后,直接跳转到 A…...
如何使用depcheck检查vue和react的依赖,以后不用把时间浪费在依赖问题上了
当我们在开发 JavaScript 项目时,会引入各种依赖库。但是有些依赖库可能只用到了部分功能,或者已经不再需要了,但是却一直被保留在项目中。 这些未使用的依赖库会占据项目的空间,增加项目的复杂度,影响项目的性能。为…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
