文件预览
文件目录树如下,如你所见,非常简单。
1. libtest/
2. |-- lt.c
3. |-- lt.h
4. `-- test.c
代码
#lt.c
1. /* lt.c
2. *
3. */
4.
5. #include
6.
7. void myprint(void)
8. {
9. printf("Linux library test!\n");
10. }
# lt.h
1. /* lt.h
2. *
3. */
4.
5. void myprint(void);
#test.c
1. /* test.c
2. *
3. */
4.
5. #include "lt.h"
6.
7. int main(void)
8. {
9. myprint();
10. return 0;
11. }
先看静态库
首先做成静态库 liblt.a 。
1. $ gcc -o lt.o -c lt.c
2. $ ar cqs liblt.a lt.o
再者,链接,
1. $ gcc test.o liblt.a -o test
这个时候再来看他的引用库情况。
1. $ ldd test
2. linux-gate.so.1 => (0xffffe000)
3. libc.so.6 => /lib/libc.so.6 (0xb7e29000)
4. /lib/ld-linux.so.2 (0xb7f6e000)
动态库
做成动态库 liblt.so 。
1. $ gcc -o lt.o -c lt.c
2. $ gcc -shared -Wall -fPIC -o liblt.so lt.o
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
链接方法I,拷贝到系统库里再链接,让gcc自己查找
1. $ sudo cp liblt.so /usr/lib
2. $ gcc -o test test.o -llt
这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so。这个搜索的路径可以通过 gcc --print-search-dirs来查找。
链接方法II,手动指定库路径
1. $ cc -o test test.o -llt -B /path/to/lib
这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量 LD_LIBRARY_PATH :
1. $ export LD_LIBRARY_PATH=/path/to/lib
这个时候再来检测一下test程序的库链接状况(方法I情况)
1. $ ldd test
2. linux-gate.so.1 => (0xffffe000)
3. liblt.so => /usr/lib/liblt.so (0xb7f58000)
4. libc.so.6 => /lib/libc.so.6 (0xb7e28000)
5. /lib/ld-linux.so.2 (0xb7f6f000)
恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
另外,运行时,要保证主程序能找到动态库,所以动态库一般发布到系统目录中,要么就在跟主程序相对很固定的路径里,这样不管主程序在本机何时何地跑,都能找得到动态库。而静态库只作用于链接时,运行主程序时,静态库文件没存在意义了。
分享到:
相关推荐
linux静态库和动态库的区别
本文详细介绍了linux下的静态库与动态库的区别,适合于那些对静态库和动态库分不清楚的同学,以及那些想要自己研究如何生成动态库的同学
Ubuntu linux动态库静态库的创建与使用附工程代码....
文档介绍了linux下静态库和动态库生成以及使用问题。文档介绍了linux下静态库和动态库生成以及使用问题。
Linux下Gcc生成和使用静态库和动态库详解Linux下Gcc生成和使用静态库和动态库详解
简单的Linux下的静态库和动态链接库的编译方法和使用发发
Linux系统下使用gcc 5.3编译器编译的boost库1.68版本的动态库和静态库,多线程参数编译,经测试可用
linux静态库和动态库制作归纳文档,详细编辑制作流程,清晰的思路。
linux下面的库文件有两种:静态链接库(xx.a)和动态链接库(xx.so)。 当一个程序使用静态链 接库,那么当link的时候,连接器会把所需要的函数拷贝到源程序里面,这样,当编译完以后,静态链接库就可以不需要了。如果...
Linux 如何使用gcc生成静态库和动态库,使用GCC编译生成静态库和动态库的方法
linux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库.doclinux下用gcc生成静态库和动态库...
Linux静态库和动态库学习总结 静态库和动态库的比较 使用静态库动态库的方法
新手入门很好用的:在Linux中创建静态库和动态库,例子和错误分析
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成...
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...
Linux下静态库和动态库的制作和使用,给新手一个自己了解并制作的指南与指导
关于库的测试代码,使用静态库动态库 解压工具tar
由于项目需要,花了一个星期研究,在64位linux下编译出来的cximage两个版本库,静态库以及动态库。亲测,在项目中运行可行
ffmpeg linux 下 arm64 环境使用的动态库和静态库打包, 内含三个压缩包: 《ffmpeg-4.3-arm64-动态库.zip》 《ffmpeg-4.3-arm64-含静态库-动态库.zip》 《ffmpeg-4.3-arm64-含静态库-动态库-带调试信息.zip》
1、二者均需要由.o文件生成,二者前缀均为lib,静态库后缀以 .a,动态库的后缀以.so 2、生成目标可执行文件后,静态库可以直接删除,因为静态库已经被加载到可...3、当静态库和动态库同名时, gcc命令将优先使用动态库