动态库(共享库)
注意:无论是制作动态库代码还是静态库代码,代码必须编译保证无错误
制作动态库的流程
- 准备代码
size.c
#include"si.h"
int add(int x,int y)
{
return (x+y);
}
int del(int x,int y)
{
return (x-y);
}
int mult(int x,int y)
{
return (x*y);
}
int divi(int x,int y)
{
return (int)(x/y);
}
size.h
#ifndef SI_HEAD_
#define SI_HEAD_
int add(int x,int y);
int del(int x,int y);
int mult(int x,int y);
int dive(int x,int y);
#endif
-
使用GCC将代码编译为动态库
-fpic 将代码编译为位置无关代码(该代码的执行与所处内存位置无关)
-shared 将代码编译为动态库
gcc size.c -o -fPIC -shared libsize.so
- 将代码文件与动态库链接
main.c
#include<stdio.h>
#include"si.h"
int main()
{
int x,y,n;
while(1)
{
printf("请输入两个数\n");
scanf("%d%d",&x,&y);
printf("请输入要进行的运算\n1.加法 2.减法 3.乘法 4.除法\n");
scanf("%d",&n);
switch(n)
{
case 1:
printf("x+y=%d\n",add(x,y));
break;
case 2:
printf("x-y=%d\n",del(x,y));
break;
case 3:
printf("x*y=%d\n",mult(x,y));
break;
case 4:
printf("x/y=%d\n",divi(x,y));
break;
default:
printf("输入的序号出错,请重新输入\n");
}
}
return 0;
}
执行以下指令将代码文件与动态库链接
gcc main.c -o main -L.-lsize
-L添加额外的动态库所在的路径 . 是当前路径
-l:添加额外的动态库的库名
然而报错
ldd 查看加载的库
可以看到原因:libsize.so not found
出错原因:
正常情况下加载动态库的流程
内核找不到库文件(自己建立的库文件不在/lib或/usr/lib内)
三种解决方法:
- 将自己的库文件存放在/lib或/usr/lib内
- 修改内核配置文件/etc/ld.so.conf.d
sudo vim /etc/ld.so.conf.d/my.conf
在文件中添加以下语句
执行下列语句使之生效
3. 修改shell配置文件,不经过内核,直接使用shell搜索动态库
sudo vim /etc/bash.bashrc
在文件末尾添加下列语句
修改成功后再进行编译运行
动态库加载成功
附图:如何使动态库生效