Linux动态链接库编程入门
下面通过一个简单的例子开始介绍Linux标准对象。 我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:设建立一个tools.h文件以及tools.c文件/*** tools.h*/#include "stdio.h"#include "stdlib.h"void draw();void write();void sign();void show();/
下面通过一个简单的例子开始介绍Linux标准对象。
我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下:
设建立一个tools.h文件以及tools.c文件
/*
** tools.h
*/
#include "stdio.h"
#include "stdlib.h"
void draw();
void write();
void sign();
void show();
/*
**tools.c
*/
#include "tools.h"
void draw()
{
printf("draw some graphics./n");
}
void write()
{
printf("write some characters./n");
}
void sign()
{
printf("sign your name./n");
}
void show()
{
printf("A picture by xufeng./n");
draw();
write();
printf("A picture is finished./n");
}
按照如下编译:
$ gcc -fPIC -shared -o libmytools.so tools.c
执行生成一个libmytools.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。
不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序:
/*
** test.c
*/
#include "tools.h"
main()
{
show();
printf("success!/n");
}
按照如下gcc编译:
$ gcc -o test test.c ./libmytools.so
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmytools.so"是当前路径下的,使用了相对路径。
如下测试结果:
$ ./test
A picture by xufeng.
draw some graphics.
write some characters.
A picture is finished.
success!
gcc编译的一些参数问题:
-I include的查找路径,也就是头文件在位置
-L 库文件的查找路径,如 gcc -o test test.c -L./mylib libmytools.so
意思是说增加./mylib到库文件的搜索路径中,此时libmytools.so不能简写mytools
-l 库文件,如-lmytools 代表在PATH下面去找libmytools.so,此时必须简写成mytools,否则出错。
如 gcc -o test test.c -lmytools
也可以指定库文件到位置,如 gcc -o test test.c ./libmytools.so 是一样的,不过最好将库文件拷贝到/lib或/usr/lib下面
更多推荐
所有评论(0)