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

posted @ 2017-03-06 22:28  逍的遥  阅读(177)  评论(0编辑  收藏  举报