前言:
目录
序言
见一见库
为什么要有库
(一)动态库(.so)
1.基本概念
2.命名规则
3.制作动态库
(二)静态库(.a)
1.基本概念
2.命名规则
3.制作静态库
(三)什么叫 fPIC
(四)对比静态库和动态库
总结
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和 动态库(.so、.dll)。
在正式的讲解动态库和静态库之前,我们先带带大家认识我们平时写 C/C++代码时用到的库
【解释说明】
其实这一点大家都能理解(造轮子和用轮子的问题):
在我们学习阶段大家可以更多的尝试去造轮子,熟悉其中的一些思想及其方法等,等到大家上班的就是 “用轮子” 的较多了。
在命名动态库时,通常会遵循一定的命名规则以确保一致性和可读性。以下是一些常见的动态库命名规则:
前缀:动态库名称通常以lib开头作为前缀,表示这是一个库文件。
中间部分:中间部分通常是描述库的名称或功能的字母数字组合。可以根据库的用途或模块来命名,以便更好地理解其功能。建议使用小写字母和下划线进行命名,以增加可读性。
扩展名:动态库的扩展名取决于操作系统和平台。在Linux上,通常是.so(共享对象);在Windows上,通常是.dll(动态链库);在Mac上,通常是.dylib(动态库)。
综合起来,一个典型的动态库命名可能如下所示:
在Linux系统上创建动态库(也称为共享库或.so文件)涉及编写、编译和链接一组源代码文件,以生成可在多个应用程序之间共享的动态链接库。
以下是创建Linux动态库的一般步骤:
1️⃣编译源代码:
使用编译器将源代码编译成位置无关的目标文件,通常使用.o
文件扩展名。为了生成动态库,需要使用 -fPIC
选项(位置无关代码)来确保目标文件可以在内存中加载并重定位。
gcc
编译器编译一个源文件并生成位置无关的目标文件: 2️⃣创建动态库:
使用共享库工具(gcc
也可以用于此)将目标文件链接到一个共享库文件中。通常,Linux动态库的命名约定是以.so
结尾,并且通常有版本号。
3️⃣运行代码:
我这里是把文件打包拷贝到 【otherPerson】目录下执行:
紧接着执行:gcc -o mytest main.c (发现报错了!!)
【解释说明】
接下来,再次执行:gcc -o mytest main.c -I include (发现还是报错了!!)
【解释说明】
接下来,再次执行:gcc -o mytest main.c -I include -L lib(发现还是报错了!!)
接下来,再次执行:gcc -o mytest main.c -I include -L lib -lmymath(发现还是报错了!!)
这次,我们发现程序正常运行成功了。紧接着,我们执行相应的文件:
【解释说明】
⭐️ 如何让系统能够找到动态库:
环境变量中确实没有我们当前的路径,因此第一种解决方法就是把我们当前的路径加入到系统的环境变量中。具体如下:
但是,这个方法是临时性的,当我们重新打开去运行时就失效了:
在配置之前,需要先把上述使用软链接创建的删除掉:
如果安装在其他目录,需要将其添加到/etc/ld.so.conf.d/文件中,步骤如下:
1.前期准备
2.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
3.运行ldconfig ,该命令会重建/etc/ld.so.conf.d/文件
需要注意一点:库云服务器默认没有静态!!!
在 Linux 上,静态库的命名规则通常是:
lib.a
其中:
综合起来,一个典型的动态库命名可能如下所示:
创建静态库涉及编写、编译和打包一组代码文件,以便它们可以在其他程序中静态链接和重用。
以下是创建静态库的一般步骤:
/myadd.h/
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif // __ADD_H__
/myadd.c/
#include "myadd.h"
int add(int a, int b)
{
return a + b;
}
/mysub.h/
#ifndef __SUB_H__
#define __SUB_H__
int mysub(int a, int b);
#endif // __SUB_H__
/mysub.c/
#include "mysub.h"
int sub(int a, int b)
{
return a - b;
}
///main.c
#include
#include "myadd.h"
#include "mysub.h"
int main()
{
int a = 10;
int b = 3;
printf("add(10, 3)=%d\n", a, b, add(a, b));
printf("add(10, 3)=%d\n", a, b, sub(a, b));
return 0;
}
【注意】
【注意】
【小结】
fPIC 是 GCC编译器的一个选项,用于生成位置无关代码(Position Independent Code,PIC)。位置无关代码是一种可以在内存中加载并且不受加载地址限制的代码,因此适合用于创建共享库(动态链接库,也称为.so文件)以及在多个进程之间共享的代码。
【解释说明】
动态库和静态库是两种不同的库文件类型,它们在编程和软件开发中有着重要的区别。以下是它们之间的主要区别:
加载时机:
文件大小:
内存占用:
可扩展性:
加载速度:
以上便是本文关于动静态的全部内容了。接下来,简单的回顾总结一下!!