Linux 动态库剖析 and Linux动态链接库编程入门

http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/

http://blog.csdn.net/taina2008/article/details/2243173

下面通过一个简单的例子开始介绍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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值