1. 准备工作
# 目录结构 add.c div.c mult.c sub.c -> 算法的源文件, 函数声明在头文件 head.h
# main.c中是对接口的测试程序, 制作库的时候不需要将 main.c 算进去
.
├── add.c
├── div.c
├── include
│ └── head.h
├── main.c
├── mult.c
└── sub.c
add.c
#include <stdio.h>
#include "head.h"
int add(int a, int b)
{
return a+b;
}
sub.c
#include <stdio.h>
#include "head.h"
int subtract(int a, int b)
{
return a-b;
}
mult.c
#include <stdio.h>
#include "head.h"
int multiply(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;
}
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;
}
2. 生成动态库
第一步,使用gcc将源文件进行汇编(参数 -c),使用参数 -fpic 或者 -fPIC 生成与位置无关的目标文件,用参数 -I 指定头文件路径
gcc add.c div.c mult.c sub.c -c -fpic -I ./include/
第二步,使用gcc将得到的目标文件打包生成动态库,需要参数 -shared
gcc -shared add.o div.o mult.o sub.o -o libcalc.so
第三步,将生成的动态库libcalc.so 和 库文件对应的头文件head.h 一起发布出去
3. 使用动态库
添加库信息相关参数,编译生成可执行程序
gcc main.c -o app -L ./ -l calc
gcc通过指定的动态库信息生成了可执行程序, 但是可执行程序运行却提示无法加载到动态库,
解决方案
方案1
方案2
方案3
验证(是否可以加载到动态库)
ldd app
再执行可执行程序就可以正确运行了。
./app