Linux学习——静态库与动态库的打包

目录

​编辑

一,动静态库介绍

1,动静态库的特点

二,静态库的打包

计算器示例

编译:

1,直接编译

2,打包

三,动态库打包

计算器示例:同上

编译:

1,直接编译:同上

2,动态库打包的方式

在写库的人在库文件所在位置使用时: 

当别人想要使用时:


一,动静态库介绍

1,动静态库的特点

1,在linux中带有.a后缀的便是静态库。带有.so的便是动态库。比如libmymath.a便是一个静态库,libmymath.so便是一个动态库,但是库的名字则是mymath,lib是库前缀。

2,静态库会被加载到可执行程序的内部所以可执行程序会变得很大。动态库则只有一份,可执行程序要使用时需要加载动态库。

3,可执行程序默认使用动态链接,只有在编译时在可执行程序后面加上-static或者只有静态库文件时才会使用静态链接的方式。

示例:

 #include<stdio.h>2 int main()3 {4   printf("hello linux\n");                                                                                                                                                              5 }

直接使用gcc编译:

使用加上-static的编译:

 

二,静态库的打包

计算器示例

代码:

add.h:

extern int add(int,int)//函数声明

add.c

  1 #include"add.h"                                                                                                                                                                         2                                                                                                3 int add(int x,int y)                                                                                               4 {                                                                                               5   return x+y;                                                                                               6 }  

sub.h

extern int sub(int,int);

sub.c

  1 #include"sub.h"                                                                                                                                                                         2 int sub(int x,int y)3 {4   return x-y;5 }

test_main.c:

  2 #include"add.h"3 #include"sub.h"4 5 6 int main()7 {8   int x = 10,y = 9;9   printf("%d-%d=%d\n",x,y,sub(x,y));10   printf("%d+%d=%d\n",x,y,add(x,y));11   return 0;12 }

编译:

1,直接编译

如果我们想要形成一个可执行文件的话,直接编译便可以了:

 gcc add.c sub.c test_main.c

2,打包

但是这样编译要将.c文件提供给使用者,这样一般是不符合开发时的要求的。开发时一般是不会将源文件提供给别人的,而只会给.h文件和库文件。所以我们就得来打包一番了。

1,打包.o文件:将所有要用到的.o文件打包到libmymath.a文件中。

2,打包.h文件:将所有的.h文件打包到一个include目录下。

Makefile文件代码:

  1  lib=libmymath.a2 $(lib):sub.o add.o3   ar -rc $@ $^ 4 5 %.o:%.c6   gcc -c $<  7 8 .PHONY:output9 output:10   mkdir -p  _lib/include11   mkdir -p _lib/mymath12   cp -rf *.h _lib/include                                                               13   cp -rf *.a _lib/mymath14 15 .PHONY:clean16 clean:17   rm -rf *.o *.a

在当前路径下生成静态库 

编译指令:gcc test_main.c -lmymath -L.

打包给别人使用:

 然后便可以像之前在当前路径下使用了。

三,动态库打包

计算器示例:同上

编译:

1,直接编译:同上
2,动态库打包的方式

代码:

  1 lib=libmymath3.so //生成.so为后缀的动态库2 $(lib):sub.o add.o3   gcc -shared -o $@ $^  //使用gcc -shared命令生成共享库(动态库)                                                                4 5 %.o:%.c6   gcc -fPIC  -c $<  //加上fPIC(与位置无关码)7 8 .PHONY:output9 output:10   mkdir -p  _lib/include11   mkdir -p _lib/mymath12   cp -rf *.h _lib/include13   cp -rf *.so _lib/mymath14 15 .PHONY:clean16 clean:17   rm -rf *.o *.so _lib 18   
在写库的人在库文件所在位置使用时: 

关于第四步:-I(大写的i)是为了链接头文件  -l(小写的L)是为了链接库   -L是为了告诉编译器去哪里找。 

当别人想要使用时:

假如现在是别人想要使用:

当前在test2文件下,_lib是下载后解压得到的。

使用:

能生成可执行文件,但是不能编译,原因是找不到.so文件。

可以使用ldd+可执行程序查看:

解决方式:让可执行程序能够找到动态库

1,将动态库拷贝到系统库中(推荐做法,但不要把自己写的文件塞进去):.so文件拷贝到usr/include路径下   .h文件拷贝到usr/include路径下

2,建立软连接

在当前文件下建立软连接:相对路径。

在系统文件里:要有完整的路径。

3,定义环境变量

定义环境变量然后export。示例:export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:绝对路径

4,找到/etc/ld.so.cnf.d/然后在里面touch一个.cnf文件,然后用sudo vim打开,然后在里面添加动态库的完整路径。

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

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

相关文章

大模型计算量纲

大模型计算量纲 1. 模型参数量(llama 13B为例) {"architectures": ["LLaMAForCausalLM"],"bos_token_id": 0,"eos_token_id": 1,"hidden_act": "silu","hidden_size": 5120,"intermediate_size&…

图像处理之《生成式隐写研究》论文阅读

这是一篇关于生成式隐写的中文综述文章 一、文章摘要 隐写术通常将秘密信息以不可见的形式隐藏到载体中&#xff0c;从而通过传递含密载体实现隐蔽通信。嵌入式隐写方案通过修改载体将秘密信息嵌入其中&#xff0c;但会不可避免地改变载体的统计特性&#xff0c;因此难以抵抗…

深度学习主流开源框架:Caffe、TensorFlow、Pytorch、Theano、Keras、MXNet、Chainer

2.6 深度学习主流开源框架 表2.1 深度学习主流框架参数对比 框架关键词总结 框架关键词基本数据结构&#xff08;都是高维数组&#xff09;Caffe“在工业中应用较为广泛”&#xff0c;“编译安装麻烦一点”BlobTensorFlow“安装简单pip”TensorPytorch“定位&#xff1a;快…

C++之模板类如何继承类实例?(二百五十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?

YIA主题设置中默认有4个广告位&#xff0c;而侧边栏的广告位由站长自行添加。boke112百科在这些广告位添加图片广告后发现图片下方有空白&#xff0c;导致下方的两个角没有变圆角&#xff0c;看起来也有点不好看。具体如下图所示&#xff1a; 其实&#xff0c;这个问题就是典型…

一周学会Django5 Python Web开发-项目配置settings.py文件-其他配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

P2024 [NOI2001] 食物链 带权并查集 循环关系

题目&#xff1a; P2024 [NOI2001] 食物链 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本文学习自&#xff1a; 题解 P2024 【食物链】 - RE: 从零开始的异世界信竞生活 - 洛谷博客 (luogu.com.cn) ———— 关系并查集其实就是在普通并查集的基础上额外开个数组r…

【Python---六大数据结构】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python---六大数据结构 往期内容前言概述一下可变与不可变 Number四种不同的数值类型Number类型的创建i…

深入解析鸿蒙系统的页面路由(Router)机制

鸿蒙系统以其独特的分布式架构和跨设备的统一体验而备受瞩目。在这个系统中&#xff0c;页面路由&#xff08;Router&#xff09;机制是连接应用各页面的关键组成部分。本文将深入探讨鸿蒙系统的页面路由&#xff0c;揭示其工作原理、特点以及在应用开发中的实际应用。 1. 实现…

OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常

问题环境 系统版本&#xff1a;OpenHarmony-3.2-Release 问题现象 配置设备默认方向&#xff0c;例如修改为横屏显示&#xff0c;修改文件display_manager_config.xml的buildInDefaultOrientation参数值为2(Orientation::HORIZONTAL)。 源码中文件位于foundation/window/win…

适用于电脑和手机的照片恢复工具指南

这是适用于 Android、iPhone、Mac 和 Windows 的最佳照片恢复应用程序的指南。 如果您不小心删除了一堆珍贵的照片&#xff0c;请不要担心&#xff01; 恢复丢失的照片和数据实际上比您想象的要容易得多。 通过使用照片恢复应用程序&#xff0c;您可以“解锁”存储卡或硬盘驱…

php基础学习之文件包含

描述 在一个php脚本中&#xff0c;将另一个php文件包含进来&#xff0c;合作实现某种功能 这个描述看起来似乎和C/Java等语言的头文件/包有点类似&#xff0c;但本质是不一样的 打个比方&#xff1a; C/Java的头文件/包更像是一个工具箱&#xff0c;存放各种很完善的工具&#…