Linux 动、静态库的实现

前言:当我们写了一段代码实现了一个方法,如果我们不想把方法的实现过程暴露给别人看,可以把代码打包成一个库,其中形成后缀为.a的是静态库,后缀为.so的为动态库;当别人想使用你的方法时,把打包好的库跟头文件一起扔给他就行。

一、静态库
1.1生成一个简单的静态库

①首先创建两个文件,一个.c方法的实现,一个.h方法的声明;

②简单实现一下

//mymath.h文件 
#pragma once int add(int x,int y);int sub(int x,int y);      
//mymath.c文件1 #include "mymath.h"  2 int add(int x,int y)  3 {  4   return x+y;  5 }  6 int sub(int x,int y)  7 {  8   return x-y;  9 }  

③makefile怎么写?

首先要把所有.c文件生成.o文件,然后把.o文件打包生成库(如果是静态库就是.a;如果是动态库就是.o)

//makefile文件1 lib=libmymath.a  2 $(lib):mymath.o                       3   ar -rc $@ $^ ## ar :生成静态库命令;  rc:把所有.o文件打包生成.a文件,如果.a里面已存在则覆盖;  $@ :依赖目标 $^:依赖文件;4 mymath.o:mymath.c5   gcc -c mymath.c  ##-c 默认生成.o文件6 .PHONY:clean    ##清理7 clean:8   rm -rf *.o *.a mylib 10 .PHONY:output      ##库发布                                                                                                                      11 output:                                      12   mkdir -p mylib/lib  #创建一串路径        13   mkdir -p mylib/include 14   cp *.h mylib/include  #把头文件拷贝到include15   cp *.a mylib/lib    #把.a 库文件拷贝到lib
~

④make一下

当前目录下已写好.c .h和makefile文件:

make后可以看到生成了mymath的.o文件,然后由.o文件生成静态库 libmymath.a:

⑤发布一下

查看一下当前目录:

可以看到生成的mylib文件就是我们制作的库文件,查看里面的内容:

可以看到其中include文件中包含了方法的头文件,lib文件中包含的就是静态库文件!

既然生成好了就来使用以下吧!

1.2 静态库的使用

①创建一个test文件然后把mylib文件拿过来用

②创建一个.c文件里面包含main函数来使用这个库

//main.c文件
1 #include "mymath.h"
2 int main()
3 {
4   printf("1+1= %d\n",add(1,1));                                                                                                                     
5   return 0;
6 }~

③静态库的编译链接

注意:库的编译链接:gcc + 带main函数的.c文件 + -I + 头文件所在的目录 + -L + 库所在的目录 + -l跟库真实的名字(去掉前缀去掉后缀)

编译后查看当前目录:

运行:

这样就成功的完成了静态库的制作到使用!接下来我们来实现下动态库吧!

二、动态库

2.1 生成一个简单的动态库

我们回到lesson16,然后makeclean,然后再创建两个.c文件分别存放两个方法,和其对应的.h方法使用声明(这两个方法用来生成动态库)

随便实现一下这两个方法(主要为了展示动态库的生成和使用):

//mylog.h文件1 #pragma once 2 void log(char* message);  
//mylog.c文件1 #include "mylog.h"2 void log(char* message)3 {4   printf("%s\n",message);                                                                                                                      5 }
//myprint.h文件1 #pragma once 2 void print();   
//myprint.c文件1 #include "myprint.h"2 void print()3 {4   printf("hello linux!!!\n");                                                                                                                    5 }                                                         
2.2 makefile怎么写

首先makefile 一次生成两个库,一个静态库、一个动态库,生成之后发布为mylib(动、静态库、头文件都在里面):

//makefile文件1 static_lib=libmymath.a ##静态库2 dynamic_lib=libmymethod.so  ##静态库3 .PHONY:all4 all:$(static_lib) $(dynamic_lib)5 $(static_lib):mymath.o6   ar -rc $@ $^ ## ar :生成静态库命令;  rc:把所有.o文件打包生成.a文件,如果.a里面已存在则覆盖;  $@ :依赖目标 $^:依赖文件;7 mymath.o:mymath.c8   gcc -c mymath.c  ##-c 默认生成.o文件9 10 $(dynamic_lib):myprint.o mylog.o11   gcc -shared -o $@ $^   ##shared: 生成动态库12 myprint.o:myprint.c13   gcc -fPIC -c $^  ##fpic  :产生位置无关码14 mylog.o:mylog.c15   gcc -fPIC -c $^16 .PHONY:clean    ##清理17 clean:18   rm -rf *.o *.a mylib *.so 19 .PHONY:output      ##库发布20 output:                                                                                                                                          21   mkdir -p mylib/lib  #创建一串路径22   mkdir -p mylib/include 23   cp *.h mylib/include  #把头文件拷贝到include24   cp *.a mylib/lib    #把.a 库文件拷贝到lib25   cp *.so mylib/lib 

make一下:

mymath生成的静态库libmumatg.a ; mylog和myprint生成的libmymethod.so动态库;

发布一下:

拿到test文件夹里用一下:

2.3 动态库的使用

创建一个main函数调用它:

//main.c文件
1 #include "mylog.h"
2 #include "myprint.h"
3 #include "mymath.h"
4 #include <stdio.h>
5 int main()
6 {
7   printf("1-1=%d\n",sub(1,1));
8   log("hello linux!!!\n");
9   print();
10   print();                                                                                                                                     
11   return 0;
12 }

编译链接:

运行:

报错因为加载的时候找不到动态库,解决方法:

①、把库拷贝到系统默认的路径下 /lib64/usr/lib64/

②、在系统文件下创建软连接  /lib64/usr/lib64/

③、LD-LIBRARY_PATH 导入环境变量

④、进入/etc/ld.so.conf.d创建.conf文件并把库路径加进去,然后重新加载 ldconfig

这里我随便用一个,导入环境变量的方法:

导入前:

导入后:

再运行:

动态库使用成功!!

三、动态库如何实现?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76602.shtml

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

相关文章

ubuntu--字体设置

样式和字体大小 在终端右键-->选择"Preferences"-->勾选"Custom font": 选择自己喜欢的样式&#xff0c;然后通过size滑动条调整字体大小&#xff0c;选择即可&#xff1a;

Qt核心知识总结

Qt核心知识总结 Qt 是一个功能强大、跨平台的 C 应用程序开发框架&#xff0c;广泛应用于图形用户界面&#xff08;GUI&#xff09;应用程序的开发&#xff0c;同时也支持非 GUI 应用程序的开发。本文将从入门到精通的角度&#xff0c;详细解析 Qt 的核心知识点&#xff0c;帮…

Linux 进程概念补充 (自用)

进程概念 内核进程进程状态内存泄漏进程调度。Linux真实调度算法环境变量 内核 狭义上的操作系统指的是 内核就是进程管理进程调度&#xff0c;文件系统等等。 广义上的操作系统其实在外壳指令这些。封装了系统调用的东西。 进程 课本概念程序的一个基本实例 内核观点&#…

【dify实战】agent结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载

使用dify agent实现数据库智能问答&#xff0c;echarts可视化展示&#xff0c;excel报表下载 观看视频&#xff0c;您将学会 在dify下如何快速的构建一个agent&#xff0c;来完成数据分析工作&#xff1b;如何在AI的回复中展示可视化的图表&#xff1b;如何在AI 的回复中加入E…

macos下 ~/.zshrc~ 和 ~/.zshrc

macos下 ~/.zshrc~ 和 ~/.zshrc ~/.zshrc通常是备份文件或临时文件&#xff0c;可能由编辑器&#xff08;如vim&#xff09;创建&#xff0c;通常可以安全删除&#xff0c;不会影响系统运行。 在Mac下&#xff0c;这种带~后缀的备份文件通常是由以下情况产生&#xff1a; 常…

位运算---总结

位运算 基础 1. & 运算符 : 有 0 就是 0 2. | 运算符 : 有 1 就是 1 3. ^ 运算符 : 相同为0 相异为1 and 无进位相加位运算的优选级 不用在意优先级,能加括号就加括号给一个数 n ,确定它的二进制位中第 x 位是 0 还是 1? 规定: 题中所说的第x位指:int 在32位机器下4个…

Java SpringBoot的自定义配置

一&#xff0c;一个类多个属性的情况 application.properties配置文件写法 my.config.ip127.0.0.1 my.config.port8080自定义配置类&#xff1a;MyTestConfig import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties…

Matlab FCM模糊聚类

1、内容简介 Matlab 211-FCM模糊聚类 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

C++项目 —— 基于多设计模式下的同步异步日志系统(4)(双缓冲区异步任务处理器(AsyncLooper)设计)

C项目 —— 基于多设计模式下的同步&异步日志系统&#xff08;4&#xff09;&#xff08;双缓冲区异步任务处理器&#xff08;AsyncLooper&#xff09;设计&#xff09; 异步线程什么是异步线程&#xff1f;C 异步线程简单例子代码解释程序输出关键点总结扩展&#xff1a;使…

C# 使用 BinaryFormatter 和相关类型时的反序列化风险

C# 使用 BinaryFormatter 和相关类型时的反序列化风险 由来&#xff1a;在项目使用.NET Reactor 混淆 C# 的序列化和反序列化发现存在的问题&#xff0c;读取文件时&#xff0c;转化为对应的类数据有时候为空&#xff0c;所以就在网上搜索了相关知识&#xff0c;在此做个笔记以…

OpenCv高阶(四)——角点检测

一、角点检测 在计算机视觉中&#xff0c;角点检测是识别图像中局部区域&#xff08;角点&#xff09;的关键技术&#xff0c;这些区域通常是两条或多条边缘的交点&#xff0c;具有丰富的结构信息&#xff0c;常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…

Conda 入门指令教程

Conda 入门指令教程 Conda 是一个强大的包和环境管理工具&#xff0c;广泛应用于数据科学和机器学习项目中。本文将介绍 Conda 的常用指令&#xff0c;帮助你快速上手。 1. Conda 基础操作 查看 Conda 版本 conda --version显示当前安装的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函数

在写Unity Shader的过程中&#xff0c;常常需要将方法封装到HLSL文件中&#xff0c;今天遇到一个这样的报错&#xff0c; 明明hlsl文件路径引用没问题&#xff0c;却引用不到方法 并且将分散文件中的函数复制过来一切正常&#xff0c;最终定位到HLSL的预编译指令中 这指令的…

uniapp上传图片时(可选微信头像、相册、拍照)

参考文献&#xff1a;微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…

单元测试的一般步骤

Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架&#xff0c;用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试&#xff1b;现问如何使用Qt进行单元测试&…

【Matlab】中国沿岸潮滩宽度和坡度分布

【Matlab】中国沿岸潮滩宽度和坡度分布 参考文献见最后或者阅读原文&#xff01; 中国沿岸潮滩宽度和坡度分布: figure 1 a 潮滩宽度分布。b 潮滩坡度分布。 图中标注了中国沿海各省&#xff0c;分别为辽宁&#xff08;LN&#xff09;、河北&#xff08;HB&#xff09;、山东&…

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本质上就是key-value键值对&#xff0c;并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作&#xff0c;这里我们以为.NET 的源码项目为例&#xff0c;来看下.NET中的配置主要是有…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

shardingsphere-jdbc集成Seata分布式事务

1、导入相关依赖 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自动拉取构建代码

新建Gitlab仓库 先在Gitab上创建一个代码仓库&#xff0c;选择创建空白项目 安装说明进行填写&#xff0c;然后点击创建项目 创建好的仓库是空的&#xff0c;什么都没有 新建一个springboot项目&#xff0c;用于代码上传使用。 只是为了测试代码上传功能&#xff0c;所以代码…