静态库(.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 = ;
int b = ; FN deal_fn = NULL;
void *handle = dlopen("./deal.so",RTLD_LAZY);
const char *err = dlerror();
if (NULL == handle)
{
printf("open err!\n");
return ;
} deal_fn =(FN) dlsym(handle,"add"); if (NULL == deal_fn)
{
printf("open add err!\n");
return ;
}
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 ;
}
编译
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