Chinaunix首页 | 论坛 | 博客
  • 博客访问: 146222
  • 博文数量: 24
  • 博客积分: 3133
  • 博客等级: 中校
  • 技术积分: 206
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-24 11:08
文章分类

全部博文(24)

文章存档

2010年(4)

2009年(20)

分类: LINUX

2010-04-24 02:28:24

静态库

    静态库在编译时拷贝到目标文件中,当多个应用程序同时引用同一个静态库时,内存中会有调用函数的多个副本。
    使用实例
   
头文件mylib.h

#ifndef __MYLIB_H__
#define __MYLIB_H__

void welcome();
void outstring(const char *);

#endif


源文件mylib.h

#include “mylib.h”
#include <stdio.h>

void welcome()
{
    printf("wellcome to libmylib\n");
}

void outstring(const char *str)
{
    if(str != NULL)
        printf("%s\n", str)
}


编译mylib.c生成目标文件

gcc -o mylib.o -c mylib.c


将目标文件加入到静态库中

ar -rcs libmylib.a mylib.o


测试程序test.c

#include "mylib.h"
#include <stdio.h>

int main()
{
    printf("creat and use library:\n");
    welcome();
    outstring("It's successful");
}


将静态库拷贝到linux的库目录下(/usr/lib 或 /lib)

sudo cp libmylib.a /usr/lib/


编译测试程序

gcc test.c -lmylib


运行程序

./a.out


程序输出

creat and use static library:
welcome to my static lib
It


动态库

    动态库在程序开始运行后调用库中函数时才会被载入,被调用函数在内存中只有一个副本,并且动态库可以在程序运行期间释放动态库所占用的内存。
    使用实例
把mylib.c创建成一个动态库

gcc -fPIC -shared -o libmylib.so mylib.c


编译测试程序(引用动态库时必须含有库的路径)

gcc test.c ./libmylib.so


运行a.out结果同上

    动态库系统函数

void *dlopen(const char *filename, int flag); //打开一个指定名称的动态库,并返回一个句柄

void *dlsym(void *handle, char *symbol); //根据动态库的句柄与函数名,返回函数名对应的函数地址


int dlclose(void *handle); //关闭动态库,handle是调用dlopen返回的句柄

const char *dlerror(void);


dlopen函数的flag:

RTLD_LAZY //在dlopen返回前,对于动态库中存在的未定义变量(如外部变量extern,也可以时函数)不执行解析

RTLD_NOW //在dlopen返回前,解析出每个未定义的变量的地址,如果解析不出来,dlopen返回NULL

RTLD_GLOBAL //使库中被解析出来的变量在随后的其他链接库中也可以使用,即全局有效


演示代码


     1 #include
     2 #include
     3
     4 int main()
     5 {
     6     void *handle;
     7     char *error;
     8     void (*welcome)();
     9
    10     if ((handle = dlopen("./mylib.so", RTLD_LAZY)) != NULL ) {
    11         welcome = dlsym(handle, "welcome");
    12         if ( (error = dlerror()) == NULL ) {
    13             welcome();
    14             dlclose(handle);
    15         }
    16     }
    17 }


编译运行程序(mylib.so在当前目录下)

[davy@HD points]$ gcc testso.c -ldl
[davy@HD points]$ ./a.out
welcome to my static lib


阅读(1973) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-08-05 19:25:28

Shanghai breast augmentation plastic surgery prices plastic surgery hospital ranking breast implant how much breast augmentation IPL IPL hair removal acne freckle mandibular angle hair removal plastic surgery hospital in Nanjing Beijing hospitals to weight-loss diet liposuction plastic surgery hospital plastic surgery hospital in Hangzhou Plastic Surgery Hospital Plastic Surgery Hospital of Guangzhou The best laser plastic surgery cosmetic laser surgery hospital of China's best plastic surgery h

chinaunix网友2011-08-05 19:24:46

整形 整形医院 武汉整形医院到九美 整形美容知美整形 隆胸整形找知美整形 整形到北京基础美 武汉整形到九美 除皱 整形美容 割双眼皮知美整形 整容首选知美整形 隆胸隆鼻整容价格上海整形医院排行假体隆胸光子嫩肤隆胸多少钱祛痘祛斑光子嫩肤脱毛南京整形医院下颌角脱毛瘦身北京整形医院减肥杭州整形医院吸脂整形医院广州整形医院整形外科医院整形最好的激光美容医院激光美容医院中国最好的整形医院整形美容医院北京整形美容医院长沙整形专家中国最好的整形专家美容最好的韩国整形医院疤痕治疗北京激光美容医院最好的隆胸医院最好的隆鼻医院武汉整形专家深圳整形专家郑州整形医院南京隆鼻医院上海九院整形价格表假体隆胸手术视频沈阳杏林整形医院张宗学医疗美容整形埋线割开双眼皮瘦脸针长沙亚韩整形医院武汉中澳整形医院玻尿酸丰胸隆鼻价格陈焕然整形医院隆鼻多少钱隆胸哪里最好武汉最好的整形医院北京最好的整形医院排行广州隆胸整形医院专家价格上海最好的隆鼻整形医院南京最好的整形医院专家价格最好的韩国整容医院 哪里能买到 整形 哪里有 请问 哪里能 买到 可以 下载 免费 赠送 地址 怎样 便宜的 如何 才能 怎么 视频 光盘