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

linux静态库与动态库

  库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在Linux 下有静态库和动态库。
  静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。因此编译出来的体积就比较大。以 lib 开头,以.a 结尾。使用 ar 命令创建静态库。
  动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候被载入的。所以程序在运行的时候需要动态库了。因此编译出来的体积就比较小。以lib 开头,以.so结尾。使用 gcc 命令创建动态库。

一、制作静态库

1.1、新建 mylib.c 文件

#include<stdio.h>
void mylib(void);
void mylib(void)
{printf("This is mylib\n");
}

1.2、将源码.c 文件编译生成.o 文件

  使用以下指令将源码.c 文件编译生成.o 文件

sudo gcc -c mylib.c

在这里插入图片描述

1.3、使用 ar 命令创建静态库

  使用以下指令创建静态库

ar cr libmylib.a mylib.o

在这里插入图片描述

1.4、编写测试代码 test.c

  编写测试代码 test.c如下

#include <stdio.h>
void mylib(void);
int main(void)
{mylib();return 0;
}

1.5、编译测试文件 test.c

  使用如下指令编译测试文件 test.c

gcc test.c -lmylib -L .

在这里插入图片描述

1.6、运行测试 a.out

  运行测试 a.out,如下图所示:
在这里插入图片描述

二、制作动态库

2.1、新建 mylib.c 文件

  新建 mylib.c 文件,编辑内容如下所示

#include<stdio.h>
void mylib(void);
void mylib(void)
{printf("This is mylib\n");
}

2.2、将源码.c 文件编译生成.o 文件

  使用以下指令将源码.c 文件编译生成.o 文件

gcc -c -fpic mylib.c 

在这里插入图片描述

2.3、使用 gcc 命令创建动态库

  使用以下指令创建动态库

gcc -shared -o libmylib.so mylib.o

在这里插入图片描述

2.4、编写测试代码 test.c

  编写测试代码 test.c,编辑内容如下所示:

#include <stdio.h>
void mylib(void);
int main(void)
{mylib();return 0;
}

2.5、编译测试文件 test.c

  使用如下指令编译测试文件 test.c

gcc test.c -lmylib -L .

  或者使用绝对目录

gcc test.c -lmylib -L /home/z/myshare/lib/2

在这里插入图片描述

2.6、运行测试 a.out

  运行测试 a.out,如下图所示:
在这里插入图片描述

三、动态库使用

  在动态库使用是,系统会默认去/lib,/usr/lib 目录下去查找动态函数库,如果我们使用的库不在里面,就会提示错误。解决这个问题有两种方法。
  第一种方法:将生成的动态库拷贝到/lib 或者/usr/lib 里面去,因为系统会默认去这俩个路径下寻找。
  第二种方法:把我们的动态库所在的路径加到环境变量里面去,比如我们动态库所在的路径为/home/test,我们就可以这样添加,但是这种方法只在当前设置的窗口有效。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/z/myshare/lib/2
http://www.lryc.cn/news/197601.html

相关文章:

  • LeetCode 面试题 10.03. 搜索旋转数组
  • SpringCloudSleuth异步线程支持和传递
  • 如何使用 Disco 将黑白照片彩色化
  • ChatGPT AIGC 制作大屏可视化分析案例
  • 2023年9款好用的在线流程图软件推荐!
  • 剑指Offer || 044.在每个树行中找最大值
  • ESP32网络开发实例-UDP数据发送与接收
  • 液压自动化成套设备比例阀放大器
  • 专业144,总分440+,上岸西北工业大学827西工大信号与系统考研经验分享
  • JQuery - template.js 完美解决动态展示轮播图,轮播图不显示问题
  • CC2540和CC2541的区别简单解析
  • Java8 新特性之Stream(八)-- Stream的collect()与Collectors的联合运用
  • SpringBoot基础详解
  • 学会Docker之---应用场景和基本操作
  • C++_linux下_非阻塞键盘控制_程序暂停和继续
  • SQL AND, OR and NOT(与,或不是运算符)
  • Python网络编程之Socket(套接字)
  • 金山终端安全系统V9.0 SQL注入漏洞复现
  • Radius OTP完成堡垒机登录认证 安当加密
  • ROS opencv 人脸识别
  • 文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告
  • 华为OD机考B卷 | 100分】阿里巴巴找黄金宝箱(JAVA题解——也许是全网最详)
  • 请求转发和重定向区别
  • JS如何判断对象为空?以及各自的缺点。
  • 同城代驾开源版小程序开发
  • 【Python机器学习】零基础掌握ShrunkCovariance协方差估计
  • 精神科常用评估量表汇总,建议收藏!
  • Python之切片
  • OpenCV显示中文(python)
  • k8s-18 认证授权