Linux下编译动态库及使用

说明:

linux下生成和使用动态库的步骤如下:

1,编写源文件。
2,将一个或几个源文件编译链接,生成共享库。
3,通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so。
4,把libxxx.so放入链接库的标准路径,或指定 LD_LIBRARY_PATH,才能运行链接了libxxx.so的程序。
 

 

一, 生成动态库

1)test.c文件

#include "test.h"

void itoa(int *num)
{
    if(*num>=65&&*num<=88)
    {
        *num=*num - 65+'a';
    }
}

 

 

2)头文件

#ifndef __ITOA_H_
#define __ITOA_H_

extern void itoa(int *); 

#endif

 


二,编译生成动态库

 

gcc test.c  -fPIC -shared -o libtest.so

-o 参数指定生成libtest.so ;此为动态库,Linux下格式为libxxx.so ;xxx 是后面你要调用的库名

 

 
 

三,使用动态库

1)自己写个测试main.c  用来测试库中的函数

 

2)使用gcc main.c -L. -ltest 生成a.out

-L. :-L参数是指定库的位置,注意此处有个'.' 表示当前路径

-l :其中-ltest表示要链接libtest.so   

 


四,运行

1)运行 ./a.out 会得到以下的错误提示。

./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

提示:找不到libtest.so。

 

2)找不到库的原因

Linux是通过 /etc/ld.so.cache 文件搜寻要链接的动态库的。

而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。
(注意, /etc/ld.so.conf 中并不必包含 /lib 和 /usr/lib,ldconfig程序会自动搜索这两个目录)

所以把 libtest.so 所在的路径添加到 /etc/ld.so.conf 中

再以root权限运行 ldconfig 程序更新ld.so.cache

a.out运行时,就可以找到 libtest.so。

 

3)使用临时解决的方法

但作为一个简单的测试例子,让我们改动系统的东西,似乎不太合适。

还有另一种简单的方法,就是为a.out指定 LD_LIBRARY_PATH。

 

LD_LIBRARY_PATH=../a.out    或者  export LD_LIBRARY_PATH=.  再执行./a.out

 

程序就能正常运行了。LD_LIBRARY_PATH=. 是告诉 a.out,先在当前路径寻找链接的动态库。

  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值