动态库制作
- 命名规则
- Linux: libxxx.so
- lib: 前缀
- xxx: 库的名字
- .so: 后缀
- Windows: libxxx.dll
- Linux: libxxx.so
- 制作:
- gcc 生成 .o 文件, 得到和位置无关的代码
gcc -c -fpic/fPIC a.c b.c
- gcc 生成动态库
gcc -shared a.o b.o -o libcalc.so
- gcc 生成 .o 文件, 得到和位置无关的代码
实例:
add.c
#include <stdio.h>
#include "head.h"
int add(int a, int b)
{
return a+b;
}
div.c
#include <stdio.h>
#include "head.h"
double divide(int a, int b)
{
return (double)a/b;
}
mult.c
#include <stdio.h>
#include "head.h"
int multiply(int a, int b)
{
return a*b;
}
sub.c
#include <stdio.h>
#include "head.h"
int subtract(int a, int b)
{
return a-b;
}
head.h
#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif
main.c
#include <stdio.h>
#include "head.h"
int main()
{
int a = 20;
int b = 12;
printf("a = %d, b = %d\n", a, b);
printf("a + b = %d\n", add(a, b));
printf("a - b = %d\n", subtract(a, b));
printf("a * b = %d\n", multiply(a, b));
printf("a / b = %f\n", divide(a, b));
return 0;
}
-
生成位置无关代码
gcc -c -fpic add. c div.c mult.c sub.c
生成目标文件 -
生成动态库
gcc -shared *.o -o libcalc.so
-
整理目录:
-
使用动态库:
gcc main.c -o main -I ./include -L ./lib -l calc
-
执行main 时会报错
error while loading shared libraries: libcalc.so : cannot open shared object file: No such file or directory
定位共享库文件
环境变量方法
-
env
可以查看环境变量 -
临时配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib
-
用户级别的配置, 打开
.bashrc
, 最下面输入exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib
, 输入source .bashrc
生效(推荐此方法) -
系统级别的配置
sudo vim /etc/profile
, 最下面输入exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/lib
,source /etc/profile
生效 -
使用
ldd main
查看动态库linux-vdso.so.1 (0x00007ffe9bdee000) libcalc.so => /home/xxx/lib/libcalc.so (0x00007fe7524f6000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe7522f1000) /lib64/ld-linux-x86-64.so.2 (0x00007fe752502000)
-
运行程序
./main
a = 20, b = 12 a + b = 32 a - b = 8 a * b = 240 a / b = 1.666667
修改文件方法
无法直接修改/etc/ld.so.cache
, 需要编辑sudo /etc/ld.so.conf
, 添加动态库的路径, 更新sudo ldconfig
即可
放入指定目录方法
直接放入 /lib/
, /usr/lib
目录, 系统的动态载入器能直接扫描到. (不推荐此方法)