linux下封装函数库——动态库.so和静态库.a(代码实现及链接方式)

article/2025/10/30 23:35:42

在linux环境下的链接库分为静态链接库(.a库)和动态链接库(.so库),其作用是把C程序编译好做成一种可执行链接文件,主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要include含有库中提供的函数接口声明的头文件即可。所以学会如何将自己的源代码封装成库进行使用很重要,接下来就来介绍一下然后进行库的封装:
1、动态链接库的制作:
首先,生成一个简单的函数实现mymax(a,b),将它封装成库来进行举例:
代码如下:

  1 int mymax(int a, int b)2 {3     if(a > b)4         return a;5     return b;6 }

这里可以通过gcc命令才生成.so库,也可以编写Makefile生成so库,Makefile如下:

  1 CC = gcc2 SRCS = mymax.c3 OBJS = $(SRCS:.c=.o)4 EXEC = libmymax.so//这里要注意生成的库文件开头必须lib开头,后缀.so5 start:$(OBJS)6         $(CC) -o $(EXEC) $(OBJS) -shared//这表明是一个动态库7 .c.o:8         $(CC) -o $@ -c $< -fPIC//表示编译函数时没有偏移地址9 clean:10         rm -rf $(OBJS)

当然也可以直接使用指令:
这里写图片描述

这里一定要注意so库的前缀必须为lib,然后将.so库链接到主程序main.c中,这里需要注意一下,因为动态库的特性,编译器会到指定的目录去寻找动态库,目录的地址在/etc/ld.so.conf.d/ 目录里的libc.conf文件里,你可以在里面加一行地址表示你so库的位置,更改完conf文件里的内容,记得输入命令行:ldconfig。
你还可以将so库复制到默认的目录下。这里是将so库复制到了默认目录下,生成可执行文件并运行,最后进行编译链接使用Makefile如下:

  1 CC = gcc2 SRCS = mylib.c3 OBJS = $(SRCS:.c=.o)4 EXEC = myapp5 start:$(OBJS)6         $(CC) -o $(EXEC) $(OBJS) -L. -lmymax7 .c.o:8         $(CC) -o $@ -c $< 9 clean:10         rm -rf $(OBJS)

这样就生成了可执行程序myapp,
注意:在加载动态链接库的时候,有可能会遇到加载不到的错误,原因在于系
统默认加载的动态链接库路径里没有找到你的动态库,有三种解决方法:
**1.在执行gcc main.c -L. -ltest -o main 前,执行 export **
LD_LIBRARY_PATH=$(pwd)
2.将你so所在的目录写到/etc/ld.so.conf文件里,然后执行ldconfig。
3.将你的so放在/etc/ld.so.conf里的路径位置里。

最后可以通过指令ldd查看执行程序的链接库都有哪些:
这里写图片描述

静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库的链接固定写入在程序中,而动态链接库则是在每次程序运行再加载链接。
接下来制作静态链接库:
这里写图片描述
最后使用nm命令可以查看程序依赖的库信息:
这里写图片描述
从中可以找到我们进行链接的静态库信息。

最后,如果对其他一些细节还需要详细了解的话,推荐一个博客,我觉得写得真的很相信,http://www.cnblogs.com/skynet/p/3372855.html

加载动态库需要指定路径的问题

gcc中的rpath参数可以用编译时指定动态库的搜索路径,这样运行时就不需要export LD_LIBRARY_PATH了。
解决方案

  • 方案一

编译时增加参数-Wl,-rpath=’.’

可执行程序运行时会搜索当前工作目录(不是进程所在目录),所以如果在其它目录运行该可执行程序时会提示找不到动态库(同样,如果建立一个软连接ln -s时,也会提示找不到动态库)。

  • 方案二

编译时增加参数-Wl,-z,origin -Wl,-rpath=’$ORIGIN’

O R I G I N 表 示 会 搜 索 进 程 所 在 目 录 ( 同 样 也 可 以 设 置 − r p a t h = ’ ORIGIN表示会搜索进程所在目录(同样也可以设置-rpath=’ ORIGIN(rpath=ORIGIN/lib’)。此方案不会出现方案一中软链接找不到动态库的情况。

  • 补充

通常情况下使用第二种方案是比较理想的,但是为了防止提升权限的漏洞,一旦进行了提升权限操作(比如chown root ping ;chmod u+s ping),则ORIGIN的设置会失效,运行可执行程序,会提示找不到动态库,即使使用export LD_LIBRARY_PATH设置了路径也无效。

要解决此问题:

  • 使用绝对路径(此方案不可取,所以没有亲自试验,应该是-rpath时指定绝对路径)
  • 将所依赖的so文件拷贝到操作系统默认会搜索的目录下,比如/lib或者/lib64等目录
    查看编译好的动态库或者进程的rpath的方法
linux
readelf -d xxx.lib
solaris
greadelf -d xxx.lib

动态库的搜索路径的顺序

编译目标代码时指定的动态库搜索路径;
环境变量 LD_LIBRARY_PATH 指定的动态库搜索路径;
配置文件 /etc/ld.so.conf 中指定的动态库搜索路径;
默认的动态库搜索路径 /lib ;
默认的动态库搜索路径 /usr/lib

大家共同进步
这里写图片描述


http://chatgpt.dhexx.cn/article/4OavhCmo.shtml

相关文章

Hyperledger fabric应用的多机部署(自动化一键部署)

前面关于fabric部署的介绍都是基于单机环境下的&#xff0c;实际生产环境中一般会根据应用场景将节点分开部署在多台物理机上&#xff0c;面临的难题主要是不同主机间的节点如何通过网络进行通信。文章最后会分享一键完成多机增加组织的自动化部署脚本。 前言 这里仍然以balan…

Linux系统编程makefile制作动态库和静态库

目录 制作动态库 制作静态库 首先准备简单的add.c&#xff0c;sub.c,main.c,head.h.具体代码如下 #head.h文件 int Add(int a, int b); int Sub(int a, int b);#add.c文件 #include <stdio.h> int Add(int a, int b) {return a b; }#sub.c文件 #include <stdio.h&…

Linux动态库的下载与配置(以libevent库为例)

** Linux动态库的下载与配置 ** 本章以下载、安装、配置libevent库为例(安装libevent的前提是已经成功安装openssl库) 一、libevent的下载 https://libevent.org/ //官网下载源码包如果学习下载1.0版本为好&#xff0c;使用可以下载2.0版本 1.如果Linux已经进行桥接联网&am…

Linux下编译安装libusb动态库(.so) - libus1-0 vs libusb-0.1

最近在调试代码的过程中&#xff0c;发现libusb库中的一些方法没办法debug到&#xff0c;所以试着下载了一版源码&#xff0c;编译安装到指定的目录。这样&#xff0c;在工程的pro文件中&#xff0c;直接指定库和头文件的目录就可以引用自己编译的libusb库了。 在网上查了相关的…

linux编译生成动态库、静态库,以及使用

一、介绍 在实际开发过程中&#xff0c;当代码的文件较多&#xff0c;可以将一部分代码编译成动态库或者静态库然后再加载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库和动态库的差异 1、链接静态库简单理解就是复制目标代码嵌入可执行文件中 2、动态库是…

Linux·libusb源码编译

libusb系列--Linux下libusb源码编译​​ ​ ​源码下载及解压​​ ​​下载源码​​ ​​解压下载的源码压缩包​​ ​​打开终端​​ ​​准备编译环境​​ ​​安装make dh-autoreconf​​ ​​安装 libudev-dev​​ sudo ​./autogen.sh​ ​​​​sudo ./configure --prefi…

ESP32如何用makefile直接编译生成.a静态库

目录 编译痛点前提环境编译准备makefile代码编译痛点 开发过esp系列的攻城狮们都知道,esp32的sdk包含了编译器、组件代码和例程代码,编译都是基于cmake的,都是整体一起编译,CMakeList.txt,component.mk,project.mk等等一系列和编译相关的文件,如果你想要自己编译一个自…

Linux 环境下的静态库生成与使用

目录 一&#xff0c;简介 二&#xff0c;如何生成静态链接库 1.准备测试程序 三&#xff0c;如何使用静态链接库 1.生成静态链接库 2.使用静态链接库 一&#xff0c;简介 这里我们只讲 Linux 环境下的静态库与动态库的生成与使用&#xff0c; Windows直接用VS直接就能生成…

Linux 下libusb编译与生成动态链接库

一、前言 上一篇文章提到了怎样使用Ubuntu 安装libusb&#xff0c;忘了如何将如何编译。 二、libusb使用GCC 编译 正常来讲&#xff0c;使用 gccc xxx.c -o xxx -I/usr/include -lusb-1.0 就可以了&#xff0c;如下图&#xff1a; 但是&#xff0c;当使用Ubuntu 12.04 使用…

关于libusb开源库的使用

关于libusb开源库的使用 文章目录 关于libusb开源库的使用1. 概述1.1 介绍1.2 用法 2. API接口2.1 分类2.2 初始化/反初始化2.3 获取设备2.4 打开/关闭设备2.5 根据ID打开设备2.6 描述符相关函数2.6.1 获得设备描述符2.6.2 获得/释放配置描述符 2.7 detach/attach驱动2.7.1 两种…

【Linux】 自动化编译工具make

目录 一&#xff1a;make工具 二&#xff1a;Makefile 三&#xff1a;Makefile基本规则 四&#xff1a;make是如何工作的 五&#xff1a;示例(五个阶段的Makefile) 5.1 第一阶段Makefile 5.2 第二阶段Makefile 5.3 第三阶段Makefile 5.4 第四阶段Makefile 5.5 第五阶…

【Linux操作系统】动态库,静态库的制作和使用,软链接、硬链接简介

目录 软硬链接咋创建一个软链接&#xff1f;咋创建一个软链接&#xff1f; 文件的三个时间动静态库制作静态库静态库的使用制作动态库动态库的使用 秃头侠们好呀&#xff0c;今天来说 软硬连接&#xff0c;动静态库 软硬链接 咋创建一个软链接&#xff1f; ln -s log.txt log…

【Linux】零基础学习动静态库打包

文章目录 一、软硬链接二、动静态库理解动静态库静态库的打包使用静态库打包Makefile编写动态库的打包使用动态库打包Makefile编写对于小版本的理解 总结 一、软硬链接 站在先前的讲过的文件系统的角度来看&#xff0c;下图test这个文件有自己独立的inode&#xff0c;在他的ino…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录 何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包 第三方库的使用静态库的使用动态库的使用 在系统层面上的动态链接理解 何为动静态库 静态库(.a)&#xff1a;在程序编译链接时将静态库二进制码拷贝到程序代码中&#xff0c;程序运行时不再需要外部的静…

覆盖libc.so.6的惨痛教训

覆盖libc.so.6的惨痛教训 背景问题原因解决1、当前session未断开2、OS崩溃重启&#xff0c;所有ssh session断开 惨痛教训1、对于上产环境的内核依赖库文件不能随意覆盖、删除。2、 scp 文件覆盖问题 总结参考 背景 发生时间: 2022年11月28日08:55:20 偷了个懒&#xff0c;在安…

【Linux】自动生成makefile(ubuntu)

文章目录 前言一、Automake工具二、具体步骤1.下载Automake2.autoscan3.重命名configure.scan为configure.ac4.修改重命名后的configure.ac5.执行aclocal命令6.autoheader7.autoconf8.创建Makefile.am9.automake10.执行configure11.执行make12.执行Makefile编译完生成的可执行文…

【Linux】基础IO —— 下(实现动静态库)

&#x1f387;Linux&#xff1a;基础IO 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看…

【Linux】第九章 动态库和静态库(生成原理+生成和使用+动态链接)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

Linux——自动化编译(make的使用)、库文件(静态库和共享库的使用)

一、make的使用&#xff08;自动化编译&#xff09; make是Linux上的工程管理工具&#xff0c;可以实现自动化编译&#xff1b;make可以提高我们的编译效率。 1.安装make 命令&#xff1a;sudo apt install make 2.make的用法 &#xff08;1&#xff09;创建makefile文件&am…

rpc系列-ZooKeeper

一.简介 Zookeeper是一个分布式协调服务&#xff0c;就是为用户的分布式应用程序提供协调服务。 Zookeeper本身就是一个分布式程序&#xff08;只要有半数以上节点存活&#xff0c;zk就能正常服务&#xff09;。 Zookeeper所提供的服务涵盖&#xff1a;主从协调、服务器节点…