库例子
#include <stdio.h>
myadd.c
int my_add(int a, int b) {
int c = a+b;
printf("c=%d a=%d b=%d\n", c, a, b);
return c;
}
myadd.h
#ifndef MYADD_HEADER_H
#define MYADD_HEADER_H
int my_add(int a, int b);
#endif
编译
gcc -fPIC -shared myadd.c -o libmyadd.so
-fPIC:产生与位置无关代码,全部使用相对地址
-shared 生成动态库
怎么调用动态库里的函数
两种方式
第一种是静态加载(编译时加载)
test.c
#include <stdio.h>
#include "myadd.h" //这个头文件需要加入
void main () {
int value = myadd(1, 2);
printf("value=%d\n", value);
}
编译链接命令
gcc -fPIC -I. test.c -L./ -lmyadd -o test
-I 头文件路径
-L 动态库路径
-l 链接的动态库名
如果出现这个问题cannot open shared object file: No such file or directory,
可以把libmyadd.so放到/usr/lib里,或者/lib里
或者export LD_LIBRARY_PATH=$./:$LD_LIBRARY_PATH
第二种方式
动态加载(运行时加载)
#include <stdio.h>
#include <dlfcn.h> //这个需要
//不需要加myadd.h
void main () {
void *dl = dlopen("./libmyadd.so", RTD_LAZY);
if (dl==NULL) {
printf("dl open libmyadd.so error\n");
return;
}
int (*addfunc)(int, int) = dlsym(dl, "my_add");
char *error = dlerror();
if (error) {
printf("dlsysm error: %s", error);
return;
}
int value = addfunc(1, 2);
printf("value=%d\n", value);
}
dlclose(dl);
char *error = dlerror();
if (error) {
printf("dlsysm error: %s", error);
return;
}
编译命令
gcc test.c -o test -ldl
静态库
同样上面的myadd.c/myadd.h
下面做个mysub.c
int my_sub(int a, int b) {
int c = a-b;
printf("c=%d a=%d b=%d\n", c, a, b);
return c;
}
mysub.h
#ifndef MYSUB_HEADER_H
#define MYSUB_HEADER_H
int my_sub(int a, int b);
#endif
gcc -c myadd.c mysub.c (生成myadd.o, mysub.o))
ar crv libaddsub.a myadd.o mysub.o
使用libmyaddsub.a
test.c
#include <stdio.h>
#include "myadd.h" //这个头文件需要加入
#include "mysub.h" //这个头文件需要加入
void main () {
int value = myadd(1, 2);
printf("value=%d\n", value);
int value2 = mysub(1, 2);
printf("value=%d\n", value);
}
编译命令
gcc -o test test.c -L. -lmyaddsub
可见用法与动态库第一种方式很相似,只是命令有点差异而已