动态库与静态库的制作和使用

目录

动态库与静态库的制作和使用

一、动态库的制作与使用

二、静态库的制作与使用


动态库与静态库的制作和使用

一、动态库的制作与使用

动态库即动态链接库(例如我们常见的Windows下的.dll文件,Linux下的.so文件都是动态库文件)。与静态库相反,动态库在编译时不会被拷贝到目标程序中。等到程序运行时,动态库才会被真正加载进来。动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用,因此动态库也被称作共享库。
1、首先编译所有的源文件,以test1.c、test2.c为例。
注意:这里的编译是使用-c编译选项将所有的源文件只进行预处理、编译、汇编而不进行链接。
gcc -fPIC -c -o test1.o test1.c
gcc -fPIC -c -o test2.o test2.c
其中:
    -fPIC选项是为了生成与位置无关的.o文件。这是由于一般我们写在源文件里的函数,相对main函数偏移是一定的,在进行链接时,回填main函数地址之后,其他源文件里的函数也就得到了地址。而动态库里的函数会用一个@plt来标识,当动态库加载到内存时,会使用加载进去的地址将@plt替换掉。使用这个参数过后,生成的函数就和位置无关,挂上@plt标识,等待动态绑定。解释起来有点难以理解,具体可以自己去网上查下资料。
2、将所有.o文件链接为动态库
gcc -shared -o libtest.so test1.o test2.o
其中:
    libtest.so中的test即为动态库库名。
3、动态库的使用    
gcc -o test main.o -l test -L libtest.so动态库所在的目录
其中:
    test : 表示最后生成的可执行文件。
    main.o : 表示其他的目标文件。这里以main.o代替。这里表示使用动态库链接其他的目标文件生成可执行文件。
    -l(小写L) : 指定使用的库文件名为test。
    -L : 指定库文件所在的路径。
4、执行生成的可执行程序,以在ubuntu系统下运行为例。
把前面制作的libtest.so动态库放到Ubuntu系统下的/lib目录里,然后就可以运行前面生成的可执行程序。
如果不想把libtest.so动态库放到/lib目录下,也可以放在某个目录,比如/abc,然后使用以下命令导出链接库的目录:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/abc
除此之外,还可以将以上指令写入到终端配置文件~/.bashrc中,使其永久生效。
最后,在运行可执行程序即可。

二、静态库的制作与使用

相比与动态库,静态库被打包到应用程序中后加载速度快、发布程序时无需提供静态库,移植方便。但是静态库相同的库文件数据可能在内存中被加载多份,消耗系统资源,浪费内存,而且静态库文件更新需要重新编译项目文件,生成新的可执行程序。
1、首先编译所有的源文件,以test1.c、test2.c为例。
注意:这里的编译是使用-c编译选项将所有的源文件只进行预处理、编译、汇编而不进行链接。
gcc -c -o test1.o test1.c
gcc -c -o test2.o test2.c
2、将所有.o文件组合生成为静态库
ar crs libtest.a test1.o test2.o
其中:
    ar是gnu归档工具,用来把.o文件打包为库文件。
3、静态库的使用
gcc -o test main.o libtest.a
  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧以南歌〆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值