- 嵌入式Linux开发技术
- 廖建尚等编著
- 698字
- 2022-05-06 19:03:55
2.3.3 Linux的动态库与静态库
2.3.3.1 静态库与动态库简介
库是一种可执行代码的二进制格式,能够加载到内存中执行,通常分为静态库(也称为静态函数库)和动态库(也称为动态函数库)。
静态库:一般命名为libxxx.a,xxx为库的名字。静态库产生的可执行文件通常比较大,整个静态库的所有数据都会被整合进目标代码中,编译后的执行程序不需要外部静态库的支持。如果静态库改变了,则必须重新编译程序。
动态库:一般命名为libxxx.m.n.so,xxx为库的名字,m是主版本号,n是副版本号。相对于静态库,动态库在编译的时候并没有被编译进目标代码中,程序执行到相关函数时才调用该动态库里的相应函数,因此动态库所产生的可执行文件通常比较小,程序的运行环境必须提供相应的动态库。动态库的改变并不影响程序,所以动态库的升级比较方便。
Linux系统有几个重要的目录存放着相应的静态库和动态库,如“/lib”和“/usr/lib”。动态库和静态库的生成过程如图2.18所示。
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_50_1.jpg?sign=1739122741-3UqUA7BxvzWuRF59IWy2NEH6PwWGtB7o-0-8eba4428b436ef19ff71b0f9f6d8e3f3)
图2.18 动态库和静态库的生成过程
2.3.3.2 静态库的制作与使用
(1)编译*.o文件。代码如下:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_50_2.jpg?sign=1739122741-9mrtFCR6slkr4voIHq4hkQeZtCz15oGe-0-b68f171fea2af7f48c30ac0a26a8c0f9)
(2)创建静态库。代码如下:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_50_3.jpg?sign=1739122741-QPfLXKfYn9cTBcJHBNhFRyDzKDjux54F-0-1cdb4e3ac0113976c1ae65bc51675d30)
(3)静态库的使用方法。
第1种方法:格式为“gcc+源文件+-L静态库路径+-l静态库名+-I头文件目录+-o可执行文件名”。例如:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_50_4.jpg?sign=1739122741-6D50ZtqWuJvpkfLphpf5rV0qdChcJRNx-0-ed07ea4713c75656c5db53924c9c5de6)
第2种方法:格式为“gcc+源文件+-I头文件+libxxx.a+-o可执行文件名”。例如:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_51_1.jpg?sign=1739122741-6n3vteiH3VBJUViO6qKFn1puvBPqK5Kn-0-5996abce7c532e5f45f3db2e3aed4ed9)
2.3.3.3 动态库的制作与使用
(1)编译与位置无关的.o文件。代码如下:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_51_2.jpg?sign=1739122741-VPr4kQzaz4b4dgeBp7xv1SFZgeswxFZI-0-80ce216aa69991cac7be5a9387cecf99)
(2)创建动态库。代码如下:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_51_3.jpg?sign=1739122741-EJQvlT0P6JsRPaY65k6cAmylKxcNiHSo-0-ff8b9f2a890bfce9bf8e11be7f10ac00)
(3)动态库的使用方法。
第1种方法:格式为“gcc+源文件+-L动态库路径+-l动态库名+-I头文件目录+-o可执行文件名”。例如:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_51_4.jpg?sign=1739122741-A7m7Ona6ejMpFjdSzHFHSHOAvvg7o5JJ-0-6c7774e845ba1c3ebfe2d7c0e5939e5e)
执行:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_51_5.jpg?sign=1739122741-3jroG5eRZIbPXK3NfiSygqPxsw8cOv1X-0-74a392e77a48ab1da0c78b056801de67)
执行失败,表示找不到链接库,没有为动态链接器(ld-linux.so.2)指定好动态库libmytest.so的路径。
第2种方法:格式为“gcc+源文件+-I头文件+libxxx.so+-o可执行文件名”。例如:
![](https://epubservercos.yuewen.com/05A69C/23020642901652606/epubprivate/OEBPS/Images/42374_51_6.jpg?sign=1739122741-Oy2YnTdi02AXtCL1PkbrLU3Rbci1BtMs-0-234b7d2b8758147a07a60ffe3099bfba)
执行成功,已经指明了动态库的路径。