下面通过一个简单的例子开始介绍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下面

 
Logo

更多推荐