Linux 静态库与动态库
Posted 逍的遥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 静态库与动态库相关的知识,希望对你有一定的参考价值。
静态库(.a)
一个deal.c usedeal.c
重点
1. gcc -c deal.c
生成 deal.o
2. ar -rsv libdeal.a deal.o
生成 libdeal.a
2.5 可以通过ar -t libdeal.a 看一个静态库都包含哪些obg文件
3. gcc -o usedeal usedeal.c -L./ -ldeal
生成可执行程序usedeal
4. ./usedeal
动态库(.so)
usedeal.c
deal.h
动态链接
1 生成.o文件
gcc -c -fPIC -o deal.o deal.c
-c表示只编译(compile),而不连接。-o选项用于说明输出(output)文件名。gcc将生成一个目标(object)文件deal.o。
注意-fPIC选项。PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。
2生成.so文件
gcc -shared -o deal.so deal.o
库文件以lib开始。共享库文件以.so为后缀。-shared表示生成一个共享库。
3.gcc -o test usedeal.c -ldeal -L.
生成test可执行程序
./test
动态加载
usedeal2.c
#include <stdlib.h> #include <stdio.h> #include "deal.h" #include <dlfcn.h> typedef void (*FN)(int a,int b); int main() { int a = 10; int b = 20; FN deal_fn = NULL; void *handle = dlopen("./deal.so",RTLD_LAZY); const char *err = dlerror(); if (NULL == handle) { printf("open err!\\n"); return 0; } deal_fn =(FN) dlsym(handle,"add"); if (NULL == deal_fn) { printf("open add err!\\n"); return 0; } deal_fn(a, b); deal_fn =(FN) dlsym(handle,"sub"); deal_fn(a, b); deal_fn =(FN) dlsym(handle,"mult"); deal_fn(a, b); dlclose(handle); return 0; }
编译
gcc -o usedeal2 usedeal2.c -rdynamic -ldl
效果
写的太急 很多地方待周末 3.11补充(╯—﹏—)╯( ┷━━━┷
参考
http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html
http://www.codeceo.com/article/linux-library.html
以上是关于Linux 静态库与动态库的主要内容,如果未能解决你的问题,请参考以下文章