2008-06-29

Linux动态链接库编程入门

关键字: 动态编译链接

Linux动态链接库编程入门
 

动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如 Win32 内核就是 3 DLL 文件构成。这种技术在 Linux 操作系统下也有对应的实现,就是 Linux 标准对象 Standard Ojbect ,对应的文件扩展名为 .so

  下面通过一个简单的例子开始介绍 Linux 标准对象。

  我们的标准对象文件含有一个函数,不需要声明 export 导出符号,只需要编译器设置即可。如下:

#include <stdio.h>

#include <stdlib.h>

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 <stdio.h>

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

  希望上文的例子可以对大家有所帮助,这也是我的毕业设计题目,待我完成之后会有一份更加完整的文档介绍 Win32DLL Linux.so 的。

评论
发表评论

您还没有登录,请登录后发表评论