动态链接库及静态链接库(windows下的.dll.lib和linux下的.so.a)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ln -S libhello.so.1.0 libhello.so.1

ln -S libhello.so.1 libhello.so

使用库

当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,

由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记,指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linUX下进行连接的缺省操作是首先连接动态库,也就

是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

现在假设有一个叫hello的程序开发包,它提供一个静态库libhello.a 一个动态库libhello.so,一个头文件hello.h,头文件中提供Sayhello()这个函数

/* hello.h */

void Sayhello();

另外还有一些说明文档。这一个典型的程序开发包结构

1. 与动态库连接]

linux默认的就是与动态库连接,下面这段程序testlib.c使用hello库中的Sayhello()函数

/*testlib.c*/

#i nclude

#i nclude

int mai n()

{

Sayhello();

return 0;

}

使用如下命令进行编译

$gcc -C testlib.c -o testlib.o

用如下命令连接:

$gcc testlib.o -lhello -o testlib

在连接时要注意,假设libhello.o和libhello.a都在缺省的库搜索路径下/usr/lib下,如果在

3.动态库的路径问题

为了让执行程序顺利找到动态库,有三种方法:

(1) 把库拷贝到∕usr∕lib和/Iib目录下。

⑵在 LD_LIBRARY_PATH 环境变量中加上库所在路径。例如动态库IibheIlo.so 在

∕home∕ting/lib目录下,以 bash为例,使用命令:|

$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ti ng/lib

(3)修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,

加入的目录下的所有库文件都可见、

4.查看库中的符号

有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有

符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种,一种

是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;一种是库中定义的函数,用T表示,这是最常见的;另外一种是所谓的弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。例如,假设开发者希望知道上央提

到的hello库中是否定义了 Printf():

$nm libhello.so |grep Printf

/* hello.c */

#i nclude

void Sayhello()

{

Prin tf("hello,world∖n");

}

用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:

gcc -C hello.c -o hello.o

1. 连接成静态库

连接成静态库使用ar命令,其实ar是archive的意思

$ar CqS libhello.a hello.o

2. 连接成动态库

生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:

$gcc -Shared -Wl,-s On ame,libhello.so.1 -o libhello.so.1.0 hello.o

另外再建立两个符号连接:

$ln -S libhello.so.1.0 libhello.so.1

$ln -S libhello.so.1 libhello.so

-Wl表示后面的参数也就是-Soname,libhello.so.1 直接传给连接器ld进行处理。实际上,每

-Wl表示后面的参数也就是-Soname,libhello.so.1 直接传给连接器ld进行处理。实际上,每

便会将Soname 嵌入连结中的二进制文件内,

而不是它正在运行的实际文件名, 在程序执行

期间,程序会查找拥有 Soname 名字的文件,而不是库的文件名,换句话说, Soname 是库

的区分标志。

这样做的目的主要是允许系统中多个版本的库文件共存, 习惯上在命名库文件的时候通常与

摘要:动态链接库技术实现和设计程序常用的技术,在 WindowS 和LinUX 系统中都有动态 库的概念,采用动态库可以有效的减少程序大小, 节省空间,提高效率,增加程序的可扩展

性,便于模块化管理。但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用

时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术,并给出了将 ViSUaI C++编

制的动态库移植到 LinUX 上的方法和经验。

动态库(Dynamic Link Library abbr , DLL)技术是程序设计中经常采用的技术。其目 的减少程序的大小,

节省空间,提高效率,具有很高的灵活性。采用动态库技术对于升级软

件版本更加容易。与静态库(StatiC Link Library )不同,动态库里面的函数不是执行程序本 身的一部分,而是根据执行需要按需载入,其执行代码可以同时在多个程序中共享。

在Windows 和LinUX 操作系统中,都可采用这种方式进行软件设计,但他们的调用方 式以及程序编制方式不尽相同。本文首先分析了在这两种操作系统中通常采用的动态库调用 方法以及程序编制方式,然后分析比较了这两种方式的不同之处,

最后根据实际移植程序经

验,介绍了将 VC++编制的Windows 动态库移植到LinUX 下的方法。

2、动态库技术

2.1 Windows 动态库技术

动态链接库是实现 Windows 应用程序共享资源、节省内存空间、提高使用效率的一个 重要技术手段。常见的动态库包含外部函数和资源,也有一些动态库只包含资源,如 Windows 字体资源文件,称之为资源动态链接库。通常动态库以 .dll ,.drv 、.fon 等作为后

缀。相应的 Windows 静态库通常以」ib 结尾,Windows 自己就将一些主要的系统功能以动

态库模块

的形式实现。

Win dows 动态库在运行时被系统加载到进程的虚拟空间中,使用从调用进程的虚拟地 址空间分配的内存,成为调用进程的一部分。

DLL 也只能被该进程的线程所访问。 DLL 的句

相关文档
最新文档