实现一个简单的计算动态链接库;升级动态链接库后,在不重新编译主程序的情况下,直接生效。
lib库:
#cat math.c#includeint add(int x, int y){ return (x + y);}int sub(int x, int y){ return (x - y);}int mul(int x, int y){ return (x * y);}int div(int x, int y){ return (x/y);}
生成动态链接库
#gcc -shared -fPIC -o libmath.so math.c
主程序:
#cat main.c#include#include #include typedef int (*cac_func)(int, int);int main(void){ void *handle; char *error; cac_func fp=NULL; handle = dlopen("./libmath.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } dlerror(); fp = dlsym(handle, "add"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } printf("add:%d\n", fp(1,1)); return 0;}
#gcc -o main.out main.c/tmp/ccTdLhjj.o: In function `main':main.c:(.text+0x1b): undefined reference to `dlopen'main.c:(.text+0x2b): undefined reference to `dlerror'main.c:(.text+0x56): undefined reference to `dlerror'main.c:(.text+0x67): undefined reference to `dlsym'main.c:(.text+0x70): undefined reference to `dlerror'collect2: error: ld returned 1 exit status
需要使用 指定使用动态链接库: dl
#gcc -o main.out -ldl main.c
运行:
#./main.outadd:2
修改库:
#cat math.c#includeint add(int x, int y){ return (x + y + 100);}
重新编译库:
#gcc -shared -fPIC -o libmath.so math.c
运行:
#./main.outadd:102