Chinaunix首页 | 论坛 | 博客
  • 博客访问: 875925
  • 博文数量: 149
  • 博客积分: 3671
  • 博客等级: 中校
  • 技术积分: 1701
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 16:52
文章分类

全部博文(149)

文章存档

2011年(57)

2010年(92)

分类: LINUX

2011-04-15 10:36:53

动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。下面通过一个简单的例子开始介绍Linux标准对象。我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:

#include

void show()
{
    printf("Standard Object by gashero\n");
}

保存为myso.c文件,按照如下编译:

$ gcc -fPIC -shared -o libmyso.so myso.c

  执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
  不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:

#include

int main()
{
   printf("Invoke my so\n");
   show();
   return 0;
}

保存为invoke.c,按照如下gcc开关编译:

$ gcc -o test invoke.c ./libmyso.so

  编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。

测试输出结果如下:

$ ./test

Invoke my so

Standard Object by gashero

注意:
 
我写了一个共享库libmy.so(假设存放当前路径的lib目录下)。
然后写了另外一个程序uselib去使用使用这个共享库,编译链接都没问题:
gcc -g -Wall uselib.c -o uselib -L ./lib -lmy
可是在运行uselib的时候出错:
./uselib: error while loading shared libraries: libmy.so: cannot open shared object file: No such file or directory

-L只是告诉链接器到制定的目录搜索so,运行的时候还得用conf或按照LD_LIBRARY_PATH搜索。
你也可以设置LD_LIBRARY_PATH,这个环境变量和PATH的作用类似。

export LD_LIBRARY_PATH=/home/foo/bar.so
静态库:

参考网址:


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