linux下的动态链接库

使用动态链接库,我认为,再比较大的程序运行过程中,是一种很有优势的。所以就花了一天时间来学习一下。

使用动态链接库,需要了解一下内容

头文件:
<dlfcn.h
>
函数:
void *dlopen(const char *filename, int flag
);
const char *dlerror(void
);
void *dlsym(void *handle, char *symbol
);
int dlclose(void *handle
);


相关的信息可以通过 man dlopen
查询

在编译动生成态链接库的时候,
需要参数
-
shared

在使用动态链接库的时候,
需要参数
-
ldl

其他相关参数有
-fpic -fPIC -
rdynamic

如有库函数文件Lib.c 主函数文件Main.
c
则有如下
Makefile

all
:
comple link

comple
:
    gcc -c Lib.c -o Lib.
o
    gcc
-c Main.c -o Main.
o

link
:
    gcc -shared Lib.o -o Lib.
so
    gcc
-ldl Main.o -
o Main


另外,在C++
中使用动态连接库的时候,请注意:
必须用
extern
"C"
{
}
将动态苦定义为C
的编译连接方式

否则由于
C++命名方式于C
不同,会造成生成的动态链接库不能使用(无法定位或函数)

文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
    程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。




文件预览
(补充)

文件目录树如下,如你所见,非常简单。

libtest
/
  
|-- lt.
c  
|-- lt.
h  
`-- test.
c  



代码
#lt.
c
/* lt.c
*
*/
  
  
#include <stdio.h>
  
  
void myprint(void)
  
{
  
printf
("Linux library test!\n");
  
}
  


# lt.
h
/* lt.h
*  
*/
  
  
void myprint(void);
  


#test.
c
/* test.c
*
*/
  
  
#include "lt.h"
  
  
int main(void)
  
{
  
myprint
();
  
return 0;
  
}
  


先看静态库
首先做成静态库
liblt.a


$
gcc -c lt.c -o lt.
o  
$ ar cqs liblt.a lt.
o  



再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。


$
gcc test.o liblt.a -
o test  


这个时候再来看他的引用库情况。

$
ldd test  
        linux
-gate.so.1 => (0xffffe000)
  
        libc
.so.6 => /lib/libc.so.6 (0xb7e29000)
  
       
/lib/ld-linux.so.2 (0xb7f6e000)
  



动态库
做成动态库
liblt.so


$
gcc -c lt.c -o lt.
o  
$ gcc -shared -Wall -fPIC lt.o -o liblt.
so  


链接方法I,拷贝到系统库里再链接,让gcc
自己查找

$
sudo cp liblt.so /usr/
lib  
$ gcc -o test test.o -
llt  

这里我们可以看到了 -llt 选项,-l[lib_name]
指定库名,他会主动搜索
lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs
来查找。

链接方法
II
,手动指定库路径

$
cc -o test test.o -llt -B /path/to/
lib

这里的-B 选项就添加 /path/to/lib gcc搜索的路径之中。这样链接没有问题但是方法
II
中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量
LD_LIBRARY_PATH
:

$ export LD_LIBRARY_PATH=/path/to/
lib  


这个时候再来检测一下test程序的库链接状况(方法I情况
)

$
ldd test  
        linux
-gate.so.1 => (0xffffe000)
  
        liblt
.so => /usr/lib/liblt.so (0xb7f58000)
  
        libc
.so.6 => /lib/libc.so.6 (0xb7e28000)
  
       
/lib/ld-linux.so.2 (0xb7f6f000)
  

恩,是不是比静态链接的程序多了一个 liblt.so
?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值