将程序做成函数库的方法可以分为静态库和动态库两种,具体步骤如下:
静态库
编写函数的.c文件 :例如,编写`add.c`, `sub.c`, `mul.c`和`div.c`等。编写Makefile:
使用`make`命令实现函数的编译和归档入库。
编译:使用`gcc -c`命令分别编译各个`.c`文件,生成目标文件(例如`add.o`, `sub.o`, `mul.o`和`div.o`)。
归档入库:使用`gcc -o libstatic.a $(objects)`命令将目标文件归档成静态库文件(例如`libstatic.a`)。
编写头文件:
例如,编写` kud.h`,声明函数库中所有函数。
在程序中使用:
在主程序中包含头文件,然后调用相应的函数。
动态库
编写函数的.c文件:
与静态库相同,编写`add.c`, `sub.c`, `mul.c`和`div.c`等。
编写Makefile:
使用`make`命令实现函数的编译和归档入库。
编译:使用`gcc -c`命令分别编译各个`.c`文件,生成目标文件(例如`add.o`, `sub.o`, `mul.o`和`div.o`)。
归档入库:使用`gcc -shared -o libdynamic.so $(objects)`命令将目标文件归档成动态库文件(例如`libdynamic.so`)。
编写头文件:
例如,编写`kud.h`,声明函数库中所有函数。
在程序中使用:
在主程序中包含头文件,然后使用`dlopen`和`dlsym`函数动态加载库并调用函数。
注意事项
静态库
:在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。静态库文件通常以`lib`为前缀,后跟库名,扩展名为`.a`。
动态库:在程序运行时需要动态加载库文件(例如`libdynamic.so`),程序运行时将加载该库并调用其中的函数。动态库文件通常以`lib`为前缀,后跟库名,扩展名为`.so`。
示例
静态库示例
编写`.c`文件
```c
// add.c
int add(int a, int b) {
return a + b;
}
```
编写Makefile
```makefile
OBJS = add.o
LIB = libstatic.a
all: $(LIB)
$(LIB): $(OBJS)
ar rcs $(LIB) $(OBJS)
add.o: add.c
gcc -c add.c
clean:
rm -f $(OBJS) $(LIB)
```
编写头文件
```c
// kud.h
int add(int, int);
```
在程序中使用
```c
// main.c
include "kud.h"
include
int main() {
int result = add(10, 20);
printf("Result: %d\n", result);
return 0;
}
```
动态库示例
编写`.c`文件
```c
// add.c
int add(int a, int b) {
return a + b;
}
```
编写Makefile
```makefile
OBJS = add.o
LIB = libdynamic.so
all: $(LIB)
$(LIB): $(OBJS)
gcc -shared -o $(LIB) $(OBJS)
add.o: add.c
gcc -c add.c -fPIC
clean:
rm -f $(OBJS) $(LIB)
```
编写头文件
```c
// kud.h
int add(int, int);
```