下面通过一个简单的例子开始介绍Linux动态链接库的生成和使用。
不需要声明export导出符号,只需要编译器设置即可。如下:
void show() {
printf("hello world!/n");
}
保存为testso.c文件,按照如下编译:
$ gcc -fPIC -shared -o libtestso.so testso.c
执行生成一个libtestso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
int main() {
show();
return 0;
}
保存为test.c,按照如下gcc开关编译:
$ gcc -o test test.c ./libtestso.so
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libtestso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。
$ ./test
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序testso.c通过gcc先编译成.o文件。
在系统提示符下键入以下命令得到testso.o文件。
$ gcc -c testso.c
在ls命令结果中,我们看到了hello.o文件,本步操作完成。
下面我们先来看看如何创建静态库,以及使用它。
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为testso,则静态库文件名就是libtestso.a。在创建和使用静态库时,
需要注意这点。创建静态库用ar命令。
在系统提示符下键入以下命令将创建静态库文件libtestso.a。
$ ar crv libtestso.a testso.o
ls命令结果中有libmyhello.a。
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。
$ gcc test.c libtestso.a -o test
$ ./test
我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。
$ rm libtestso.a
rm: remove regular file `libtestso.a'? y
$ ./test