当前位置: 首页 > news >正文

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.演示

TK8z.jpg

三.动态链接库的创建与使用

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:xxxxxx为动态库文件的绝对存储路径)。保存之后,执行source .bashrc指令(此方式仅对当前登陆用户有效)。

接下来你重新运行即可成功。

5.演示

T5GT.jpg

四.补充知识点

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操作系统下的链接库相关知识&#xff0c;由于相关概念已在Windows下链接库一文中介绍&#xff0c;本篇博客直接上操作。 二.静态链接库的创建和使用 1.提前看 这里主要介绍的是C语言的链接库技术&#xff0c;而在Linux下实现C语言程序&#xff0c…...

基于.Net开发的、支持多平台、多语言餐厅点餐系统

今天给大家推荐一套支持多平台、多语言版本的订单系统&#xff0c;适合餐厅、酒店等场景。 项目简介 这是基于.Net Framework开发的&#xff0c;支持手机、平板、PC等平台、多语言版本开源的点餐系统&#xff0c;非常适合餐厅、便利店、超市、酒店等&#xff0c;该系统基础功…...

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目录选择器

大家使用任意一款浏览器&#xff08;例如&#xff1a;Chrome、Edge&#xff09;下载文件时&#xff0c;如果【另存为】对话框选择C:\Download&#xff0c;那么下次再次使用【另存为】功能&#xff0c;对话框默认显示C:\Download&#xff0c;而不是根目录。 在VBA开发中调用目录…...

electron入门 | 手把手带electron项目初始化

Electron是一个基于Chromium和 Node.js&#xff0c;可以使用 HTML、CSS和JavaScript构建跨平台应用的技术框架&#xff0c;兼容 Mac、Windows 和 Linux。 目录 1.了解electron 2.开发环境 3.初始化 采坑插曲&#xff1a; 1.了解electron Electron 可以让你使用纯 JavaScrip…...

​力扣解法汇总2423. 删除字符使频率相同

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个下标从 0 开始的字符串 word &#xff0c;字符串只包含小写英文字母。你…...

【超算/先进计算学习】日报8

目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记阶段一阶段二阶段三阶段四 对自己的表现是否满意简述下次计划其他反馈 今日已完成任务列表 超算/高性能计算总结 遇到的问题及解决方案 无 任务完成详细笔记 阶段一 在学习的第一阶段&#xff0c;我们首先对需要…...

《LearnUE——基础指南:上篇—2》——GamePlay架构之Level和World

目录 听说世界是由多个Level组成的 1.2.1 引言 1.2.2 建造大陆&#xff08;ULevel&#xff09; 1.2.3构建世界&#xff08;World&#xff09; 1.2.4总结 听说世界是由多个Level组成的 1.2.1 引言 上小节谈到Actor和Component的关系&#xff0c;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&#xff0c;它关联到特定的User/Role/Group上&#xff0c;指定这些主体能对哪些资源进行怎样的操作 Resource-based policy&#xff0c;它关联到具体的AWS资源上&#xff0c;指定哪些主体可以对这个资源做怎样的操作 aws受信任关系视为aws服务可以实现&a…...

【VAR | 时间序列】以美国 GDP 和通货膨胀数据为例的VAR模型简单实战(含Python源代码)

以美国 GDP 和通货膨胀数据为例&#xff1a; 1. 数据集 下载数据我们需要从 FRED 数据库下载美国 GDP 和通货膨胀数据&#xff0c;并将它们存储在 CSV 文件中。可以在 FRED 网站&#xff08;https://fred.stlouisfed.org/&#xff09;搜索并下载需要的数据。在这里&#xff0…...

常用的设计模式之二(行为型模式)

文章目录 观察者模式模板模式 观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并进行相应的处理。 观察者…...

MYSQL基本操作(增删改查)

数据库的列类型 int&#xff1a;整型 用于定义整数类型的数据 float&#xff1a;单精度浮点4字节32位 准确表示到小数点后六位 double&#xff1a;双精度浮点8字节64位 char&#xff1a;固定长度的字符类 用于定义字符类型数据&…...

双周赛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前序遍历&#xff08;先序遍历&#xff09;3.2中序遍历3.3后序…...

蓝牙耳机哪款性价比高一些?2023年性价比最高的蓝牙耳机推荐

随着科技的进步&#xff0c;蓝牙耳机已然成为我们生活中的一部分&#xff0c;无论是通勤、追剧、运动或者玩游戏&#xff0c;大都会用到蓝牙耳机。那么&#xff0c;哪款蓝牙耳机的性价比高一些&#xff1f;相信大多数人在选择产品的时候&#xff0c;都会看性价比。接下来&#…...

等保2.0存在的问题

等保制度和技术要求 国家信息安全等级保护制度(二级)相关要求包含技术要求和管理要求,技术要求包含:物理安全、网络安全、主机安全、应用安全及数据安全及备份恢复;管理要求包含:安全管理机构、安全管理制度、人员安全管理、系统建设管理、系统运维管理。 一、 技术要求 …...

国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作

IAP升级 Bootloader的制作 1、上节提到Flash的分区&#xff0c;0x8000000-0x8004000为Boot分区&#xff0c;我们的bootloader就烧录到此分区。 Bootloader很简单&#xff0c;新建一个普通的工程&#xff0c; 也不用初始化外部设备&#xff0c;开机后&#xff0c;直接跳转到 A…...

如何使用depcheck检查vue和react的依赖,以后不用把时间浪费在依赖问题上了

当我们在开发 JavaScript 项目时&#xff0c;会引入各种依赖库。但是有些依赖库可能只用到了部分功能&#xff0c;或者已经不再需要了&#xff0c;但是却一直被保留在项目中。 这些未使用的依赖库会占据项目的空间&#xff0c;增加项目的复杂度&#xff0c;影响项目的性能。为…...

使用Python和机器学习进行文本情感分类

使用Python和机器学习进行文本情感分类 1. 效果图2. 原理3. 源码参考这篇博客将介绍如何使用Python进行机器学习的文本情感分类(Text Emotions Classification)。 1. 效果图 训练文本及情感分类前5条数据如下: 训练过程及测试文本情感分类效果图如下: 可以看到 对文本“S…...

QML路径视图(The PathView)

路径视图&#xff08;PathView&#xff09;非常强大&#xff0c;但也非常复杂&#xff0c;这个视图由QtQuick提供。它创建了一个可以让子项沿着任意路径移动的视图。沿着相同的路径&#xff0c;使用缩放&#xff08;scale&#xff09;&#xff0c;透明&#xff08;opacity&…...

5月4号软件资讯更新合集.....

&#x1f680; Layui 2.8.2 发布 更新日志 table 修复 autoSort: true 时&#xff0c;更改 table.cache 未同步到 data 属性的问题 修复 多级表头存在 hide 表头属性时&#xff0c;执行完整重载可能出现的错位问题 修复 未开启 page 属性时底边框缺失问题 优化 打印内容中…...

基于 Rainbond 的混合云管理解决方案

内容概要&#xff1a;文章探讨了混合云场景中的难点、要点&#xff0c;以及Rainbond平台在跨云平台的混合云管理方面的解决方案。包括通过通过统一控制台对多集群中的容器进行编排和管理&#xff0c;实现了对混合云中应用的一致性管理。文章还介绍了Rainbond平台在混合云环境下…...

加强网络风险生命周期

当今业务环境中云原生应用程序的激增帮助组织简化了运营。 企业现在可以近乎实时地监控数据、与客户互动并分享见解&#xff0c;帮助他们克服曾经阻碍生产力的低效率问题。 然而&#xff0c;使用云也极大地扩展了企业可利用的攻击面。 CSPM、CWPP、CNAPP、SAST、SCA、IaC、D…...

Java——二叉树的深度

题目链接 牛客网在线oj题——二叉树的深度 题目描述 输入一棵二叉树&#xff0c;求该树的深度。从根结点到叶结点依次经过的结点&#xff08;含根、叶结点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度&#xff0c;根节点的深度视为 1 。 数据范围&am…...

一般现在时(二)

一般现在时(二) 1.什么叫实义动词? 实义动词是指表示有具体意思的动词&#xff0c;也叫行为动词。 例如:like(喜欢) eat(吃) live(居住) have(有) run(跑)等等。 实义动词占英语中动词的绝大多数 &#x1f516;我们已学过的be动词可译为是,有时译为成为,有时则没有具体意…...

leetcode657. 机器人能否返回原点

题目描述解题思路执行结果 leetcode657. 机器人能否返回原点 题目描述 机器人能否返回原点 在二维平面上&#xff0c;有一个机器人从原点 (0, 0) 开始。给出它的移动顺序&#xff0c;判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串 moves 表示。字符 mov…...

DAY 48 Nginx的 location与rewrite模块

[正则表达式] 常用的[Nginx] 正则表达式 $ &#xff1a;匹配输入字符串的结束位置* &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” &#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”&#xff0c;但不能匹配“…...

Linux 常用操作技巧

Linux 操作技巧大全 Linux是一种强大的操作系统&#xff0c;掌握各种操作技巧可以帮助我们惬意地使用它。在这篇博客中&#xff0c;我们将分享一些实用的Linux技巧&#xff0c;希望能对您有所帮助&#xff01; 1. 使用Tab进行自动补全 在输入命令时&#xff0c;按下Tab键可…...

软件下载类型网站怎么做/武汉seo结算

后退文件夹: cd - 在重复一遍就是前进了 转载于:https://www.cnblogs.com/Baronboy/p/7787760.html...

wordpress 判断语言/泉州排名推广

IP核&#xff1a;美国著名的Dataquest咨询公司将半导体产业的IP定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”。IP主要分为软IP、固IP和硬IP。软IP是用Verilog/VHDL等硬件描述语言描述的功能块&#xff0c;但是并不涉及用什么具体电路元件实现这些功能。固IP是完成了综…...

360建筑网官方网站/域名查询系统

终极版C语言&#xff08;十六&#xff09;—3380人已学习 课程介绍 整个教程以 C 语言为核心&#xff0c;完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密&#xff0c;以及各种精…...

面试网站建设问题/电话营销销售系统

“云计算”这个词在今年颇为流行&#xff0c;以至于我终于不能再继续厚着脸皮当作没看到了。最初&#xff0c;我以为云计算就是一堆客户端计算机紧密的团结在一起&#xff0c;为一个共同的伟大的问题而献出自己的业余时间。后来某男告诉我&#xff0c;那叫网格计算&#xff0c;…...

dreamweaver网页设计期末考试/电脑系统优化软件

​刚换了一台新电脑&#xff0c;可是收藏夹都在之前的电脑上&#xff0c;是不是再一个一个找到网站收藏&#xff1f;答&#xff1a;当然不是&#xff01;&#xff01;&#xff01;你遇到的问题我们优秀的浏览器开发工程师门早就已经想到啦&#xff0c;效率君给你提供两种解决方…...

怎么做直播室的网站/灰色词排名上首页

第一部分需要三个步骤&#xff1a; 选择输入步骤&#xff0c;“生成记录”&#xff0c;将步骤里设置记录数为1&#xff0c;并设置一个类型为String的字段country&#xff08;名字随便&#xff09;&#xff0c;这个字段的值应设置为我们要抽取数据的URL&#xff0c;如&#xff1…...