Linux下静态库、动态库的创建和使用
2017-05-05 15:27
369 查看
静态库、动态库的创建和使用
1.按照如下目录,建立如下文件
![](https://img-blog.csdn.net/20170505151632984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505151707078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505151741884?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505151754087?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505151813657?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505151828806?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505151839088?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.创建静态库
![](https://img-blog.csdn.net/20170505152001909?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
创建lib文件夹,用来存放库文件
![](https://img-blog.csdn.net/20170505152109887?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505152121583?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505152142184?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
编译连接,生成可执行程序:
![](https://img-blog.csdn.net/20170505152206100?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
显示目录和文件:
![](https://img-blog.csdn.net/20170505152228226?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
静态库:app放到哪里都可以运行,因为静态库已经编译到app中,也导致其代码体积庞大
动态库:运行的电脑需要有动态库,且版本号要一致,但是其代码体积小。
创建动态库(共享库)
![](https://img-blog.csdn.net/20170505152250429?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker name。
真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。
soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个共享库就可以用。如libmyab.so.1和libmyab.so.2是两个主版本号不同的libmyab,有些应用程序依赖于libmyab.so.1,有些应用程序依赖于libmyab.so.2,但对于依赖libmyab.so.1的应用程序来说,真正的库文件不管是libmyab.so.1.10还是libmyab.so.1.11都可以用,所以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优点。注意libc的版本编号有一点特殊,libc-2.8.90.so的主版本号是6而不是2或2.8。
linker name仅在编译链接时使用,gcc的-L选项应该指定linker name所在的目录。有的linker name是库文件的一个符号链接,有的linker name是一段链接脚本。例如上面的libc.so就是一个linker name,它是一段链接脚本.
![](https://img-blog.csdn.net/20170505152350556?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
此时找不到动态库
![](https://img-blog.csdn.net/20170505152402837?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
a.需要设置共享库的加载路径:
![](https://img-blog.csdn.net/20170505152424244?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
b.打开后添加最后一行:
![](https://img-blog.csdn.net/20170505152442588?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
c.更新共享库加载路径:
![](https://img-blog.csdn.net/20170505152457620?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
查看:
![](https://img-blog.csdn.net/20170505152514949?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
再次编译连接:
![](https://img-blog.csdn.net/20170505152524824?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以手动添加link name:
![](https://img-blog.csdn.net/20170505152547888?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170505152610731?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhbmdndWFueXVubGFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
执行程序:
1.按照如下目录,建立如下文件
2.创建静态库
创建lib文件夹,用来存放库文件
编译连接,生成可执行程序:
显示目录和文件:
静态库:app放到哪里都可以运行,因为静态库已经编译到app中,也导致其代码体积庞大
动态库:运行的电脑需要有动态库,且版本号要一致,但是其代码体积小。
创建动态库(共享库)
gcc -shared -Wl,-soname,libmycal.so.1 -o libmycal.so.1.0.1 a.o b.o
按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker name。
真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。
soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个共享库就可以用。如libmyab.so.1和libmyab.so.2是两个主版本号不同的libmyab,有些应用程序依赖于libmyab.so.1,有些应用程序依赖于libmyab.so.2,但对于依赖libmyab.so.1的应用程序来说,真正的库文件不管是libmyab.so.1.10还是libmyab.so.1.11都可以用,所以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优点。注意libc的版本编号有一点特殊,libc-2.8.90.so的主版本号是6而不是2或2.8。
linker name仅在编译链接时使用,gcc的-L选项应该指定linker name所在的目录。有的linker name是库文件的一个符号链接,有的linker name是一段链接脚本。例如上面的libc.so就是一个linker name,它是一段链接脚本.
此时找不到动态库
a.需要设置共享库的加载路径:
b.打开后添加最后一行:
c.更新共享库加载路径:
查看:
再次编译连接:
可以手动添加link name:
执行程序:
相关文章推荐
- Linux下静态库、动态库的创建和使用
- 我使用过的Linux命令之ar - 创建静态库.a文件/关于Linux静态库和动态库的分析
- VisualGDB系列7:使用VS创建Linux静态库和动态库
- linux---静态库与动态库的创建、生成、使用
- linux 下静态库和动态库的创建,编译,和使用
- linux下静态库、动态库的创建与使用
- 问题集合 ---- linux 静态库和动态库创建、检查、使用建议
- linux 动态库 静态库 创建和使用
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
- linux 静态库(.a)、动态库(.so)的创建生成和使用方法
- linux下静态库和动态库的创建和使用
- Linux下静态库和动态库的创建和使用
- Linux下静态库和动态库的创建和使用
- VisualGDB:使用VS创建Linux静态库和动态库
- linux下静态库和动态库的创建和使用
- Linux下静态库,动态库的创建和使用,多个动态库使用
- Linux中静态库和动态库的创建和使用
- Linux下静态库和动态库的创建和使用( 转载 )
- Linux静态库和动态库的创建与使用
- linux中静态库和动态库的创建和使用