链接:静态库文章
上一章我们讲解了静态库的生成和两种使用,我们这章来谈谈动态库。
举个例子:
动态库:在一个100米跑道上中间有两个电线杆相距20米;
静态库:第一个电线杆与终点的距离是60米。
现在我们把跑道改为200米,那么静态库的距离就是错误的,它已经失效了;但动态库的两个电线杆的相对距离不变。
本章演示代码:(就是静态库那章代码)
/mymath.h/
#pragma once
#include
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
#include
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
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文件作区别。
指令如下:
mkdir -p output/lib
mkdir -p output/include
cp -rf *.h output/include
cp -rf *.a *.so output/lib
打包后按二叉树分布是下面这个样子:
如果只有静态库那就链接的是静态库。
什么意思那?
实操如下:
gcc main.c -I ./output/include/ -L ./output/lib/ -lhello
使用上面的指令我们发现运行可执行文件就出错了
原因是:默认生成的是动态库,而可执行文件和动态库分批加载到内存中;可是我们只告诉了gcc未告诉系统我们这是一个动态库所以就报错了。
那么两个库同时存在,我就想使用静态库,怎么操作的?
只需在原来的指令上加 -static就可以了
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
注意:二、三区别是,二是把环境变量写到内存中,我们退出系统自动就清楚路径了;三是下次登录时,仍然有效。