文章目录
- 0. 前言
- 1. 生成动态库
- 1.1 我们把静态库和动态库打包
- 1.2 当动静库同时存在的时候默认生成的是动态库
- 1.3 -static
- 2. 动态库的使用
- 2.1 运行动态库的方法
- 3. 库文件名称和引入库的名称
0. 前言
链接:静态库文章
上一章我们讲解了静态库的生成和两种使用,我们这章来谈谈动态库。
举个例子:
动态库:在一个100米跑道上中间有两个电线杆相距20米;
静态库:第一个电线杆与终点的距离是60米。
现在我们把跑道改为200米,那么静态库的距离就是错误的,它已经失效了;但动态库的两个电线杆的相对距离不变。
本章演示代码:(就是静态库那章代码)
/mymath.h/
#pragma once
#include<stdio.h>
extern int MyAdd(int a, int b);
/mymath.c/
#include"mymath.h"
int MyAdd(int a, int b)
{
return a+b;
}
/myprint.h/
#pragma once
#include<stdio.h>
#include<time.h>
extern void MyPrint(const char* str);
/myprint.c/
#include"myprint.h"
void MyPrint(const char* str)
{
printf("%s[%d]\n", str, (int)time(NULL));
}
///main.c
#include "myprint.h"
#include "mymath.h"
int main()
{
MyPrint("hello world");
int res = MyAdd(1,100);
printf("res: %d\n", res);
return 0;
}
————————————————
版权声明:本文为CSDN博主「潜水少年请求出战」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Dingyuan0/article/details/127649870
1. 生成动态库
-
shared: 表示生成共享库格式
-
fPIC:产生位置无关码(position independent code)
-
库名规则:libxxx.so
生成动态库的指令如下:gcc -fPIC -c mymath.c -o mymath_d.o gcc -fPIC -c myprint.c -o myprint_d.o gcc -shared mymath_d.o myprint_d.o -o libhello.so
上面.o文件前加个_d目的只是为了与上一章静态库生成的.o文件作区别。
1.1 我们把静态库和动态库打包
指令如下:
mkdir -p output/lib
mkdir -p output/include
cp -rf *.h output/include
cp -rf *.a *.so output/lib
打包后按二叉树分布是下面这个样子:
1.2 当动静库同时存在的时候默认生成的是动态库
如果只有静态库那就链接的是静态库。
什么意思那?
实操如下:
gcc main.c -I ./output/include/ -L ./output/lib/ -lhello
使用上面的指令我们发现运行可执行文件就出错了
原因是:默认生成的是动态库,而可执行文件和动态库分批加载到内存中;可是我们只告诉了gcc未告诉系统我们这是一个动态库所以就报错了。
1.3 -static
那么两个库同时存在,我就想使用静态库,怎么操作的?
只需在原来的指令上加 -static就可以了
2. 动态库的使用
-
编译选项
-
l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
2.1 运行动态库的方法
1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
- 就是拷贝到系统路径下,静态库说过,我们不建议这样作。
2、更改 LD_LIBRARY_PATH
[Ding@VM-4-6-centos uselib]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Ding/my/22116/uselib/output/lib
3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
-
先在 /etc/ld.so.conf.d/ 路径下创个文件(sudo是一个root指令)
[Ding@VM-4-6-centos uselib]$ sudo touch /etc/ld.so.conf.d/Ding.conf
-
在这个新创的文件下,存动态库的路径就可以了
-
然后跟新一下ldconfig更新
sudo ldconfig
4、动态库与路径建立软链接。
例子:
sudo ln -s /home/Ding/my/22116/uselib/output/lib/libhello.so /lib64/libhello.so
注意:二、三区别是,二是把环境变量写到内存中,我们退出系统自动就清楚路径了;三是下次登录时,仍然有效。
3. 库文件名称和引入库的名称
- 如:libc.so -> c库,去掉前缀lib,去掉后缀.so或.a