现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Linux下 静态库(*.a)和动态库(*.so) 的区别及应用分析

2019-01-01 21:03 工业·编程 ⁄ 共 1837字 ⁄ 字号 暂无评论

1、静态库和动态库的区别

(1)所谓静态库(*.a),就是程序link的时候就把静态库中的东西取出来,放到生成的可执行文件中,当这个可执行文件执行时,就不需要再次调用这个静态库了。

(2)所谓动态库(*.so),就是程序link的时候,只是将库中的 符号包含,并没有包含静态库里的内容,等到可执行程序在执行

时,需要依赖动态库中的内容,也就是“随用随取”。

(3)在linux编程中,对于静态库和动态库,在makefile中引用方式一模一样,只不过如果使用动态库,我们需要将动态库拷贝到目标系统中,比如拷贝到usr/lib下,然后可执行程序才能正常执行。而对于静态库,只要我们编译链接成功生成可执行文件,就不需要再目标系统中再拷贝了,因为可执行文件中已经包含了静态库的全部。

(4) 静态库和动态库的优缺点也是明显的,对于静态库,只要 编译链接成功,只需要将可执行文件放到目标板上,就可以直接执行,而不用再拷贝静态库了,一次性的,执行效率也更高 一些,缺点是当静态态库升级,则需要重新编译链接。而对于动态库,不仅需要将可执行文件拷贝到目标板上,还需要将动态库也拷贝到目标板上,缺点是执行速度相对慢一些。不过优点就是,当动态库升级时,我们只需要将动态库重新拷贝到目标板上,而 可执行程序并不需要 重新编译链接(前提是动态库接口不变)。

2、“库”的概念

接下来我们来分析一下 “库”这个 概念。“库”的概念在操作系统编程中无处不在,不管是Windows下还是linux下,还是其他系统,甚至于裸机编程,基本上可以这么说,目前只要是写代码,都离不开各种库,只不过我们在使用各种IDE时,IDE已经自动的使用了一些标准库了。所谓“库”就是“集合”的概念,软件技术发展到今天,每一个程序员写的代码都使用了很多前人造的“轮子”,最基本的标准库,还有一些开源库。

静态库(*.a)、动态库(*.so)、可执行程序(exe)都是目标文件,是最终产物,而C/C++文件是源代码,我们通过编译器gcc或IDE对源代码进行编译、链接、生成这些目标文件。所以编译、链接、生成是中间过程,这个中间过程会产生中间文件obj,之所以我们需要这些中间文件obj,是因为我们不可能一次就能得到目标文件,比如说一个可执行文件exe需要很多的.cpp文件,而编译器一次只能编译1个cpp文件,编译后的中间文件一般是*.o格式,当编译器将所有所需的.cpp文件都编译完成后,链接器将这些*.o中间文件统一链接生成.exe文件,所以说缺少任意一个obj文件都会导致exe文件的链接失败。

中间文件.obj里存放的是“编译”操作后的 代码和数据,这些 代码和数据会有名称,也就是符号,链接器在的“链接”动作就是通过这些符号来实现的,所以我们在一些IDE中,会出现一些“未定义符号”的报警信息。不过当链接生成可执行文件exe后,也就不存在符号名称的概念了,因为符号只是给程序员看的,对于CPU来讲,它只认 地址。 所以,这里有个简单的结论:

库文件就是 一堆中间文件obj(.o) 的集合。

本质上静态库和动态库是没有太大区别的,包括我们在引用 命令上,也是没有区别的,只不过链接器会根据库的类型做不同的链接动作,即 静态库 就是 全部取出,而动态库先取出符号,在程序执行时,随用随取。

3、静态库和动态库的创建命令

(1)静态库的创建使用 ar  命令,比如:

ar -cr libmyhello.a  hello.o

(2)动态库的 创建 采用gcc + 参数选项,比如:

gcc -shared -fPIC -o libmyhello.so hello

从参数 shared 也可知,动态库具有 共享的特性。

4、静态库和动态库的使用方式

(1)在makefile中, 引用这这两种库的命令是完全一样的,需要使用 -L和-l参数选项,命令代码举例如下:

gcc -o hello main.c -L. -lmyhello  # 注意 尽可能将 -lmyhello 放到后面,防止出现库未定义报警

# 或者

gcc main.c libmyhello.a -o hello

关于 -L和-l 的命令参数可以 参考之前的文章《gcc "-I"(大写i)、 "-l"(小写l)、"-L"(大写L)的使用小结 》

(2)如果我们使用的 静态库,只要编译链接成功生成 可执行文件, 只需要将可执行文件 拷贝到目标板上执行即可。 而如果使用的动态链接库,编译生成可执行文件后,需要将 可执行文件 + 动态链接库都拷贝到目标板上,一般将动态链接库拷贝到/usr/lib目录下,这样可执行文件才能执行成功。

给我留言

留言无头像?