目录
之前我在学习和动手操作静态库和动态库的过程中遇到的问题,已在本教程中解决并写到了操作过程中,教程从之前的一篇博客中分离出,本文单独讲解两种库的建立;
学习过程中遇到的问题:
- 测试静态库时,“gcc main.c -L./库文件所在的文件夹名 -lmyfile”,该命令的-L.后面没有加库文件所在的文件夹名,因为库文件就在下一级的文件夹中,所以只需要加一个文件夹名;或者有时候会忘记添加“-L”后面的“.”。
- 将动态库的库文件复制到“/usr/lib”文件夹下时,提示该文件夹下不能复制,手动复制粘贴也不行,不能点击粘贴选项,所以必须在命令前添加sudo保证有足够大的权限。
- 分享一篇解决找不到静态库问题的链接:关于C#:找不到静态库 | 码农家园
一,库
1.概念
库就是把一些常用函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用;
本质上来说,库是一种可执行代码的二进制形式。
2.库的分类
库包括静态库和动态库。
1-静态库和动态库的区别:
静态库 | 动态库 | |
什么时候载入代码 | 程序编译时(链接过程) | 程序运行时 |
优点 | 运行时不需加载库,运行速度更快 | 代码体积小,程序升级简单,不同程序调用相同的库,只需要在内存中有一份共享库 |
缺点 | 代码体积大,静态库升级时,程序需要重新编译链接 | 运行时需要动态库的存在,移植性差 |
2-静态库的建立
在文件夹file中创建一个没有头文件的file.c文件,文件中实现返回两个整型数相加的值的函数功能;
(1)将原文件编译生成目标文件
gcc -c file.c -o file.o
命令执行后,file文件夹中出现file.o文件;
(2)用ar命令创建静态库,将.o文件转换为.a文件
ar crs libmyfile.a file.o
命令执行后,file文件夹中出现静态库文件limyfile.a
(3)测试静态库。在main.c所在的文件目录下
在相同路径下的上一级的文件夹中创建main.c和file.h文件,在file.h文件中声明file.c中的函数,main.c要包含file.h文件;
gcc main.c -L./库文件所在的文件夹名 -lmyfile //-L是指定库的路径,注意L后面有个点
(l后面跟静态库名,在编译时会自动补全lib)
执行./a.out
执行可执行文件后,终端输出两数相加之和。
3-动态库的建立
首先要操作的与静态库的操作相同,在文件夹test中创建一个没有头文件的test.c文件,文件中实现返回两个整型数相乘的值的函数功能;也要在上一个文件夹中创建main.c和test.h,main.c要包含test.h头文件,test.h中要声明test.c中的函数;
(1) gcc -fPIC -c test.c -o test.o
gcc -shared -o libmytest.so test.o
(2)把库拷贝到/usr/lib的/lib目录下(编译时就不需要指定库的路径,最方便的操作)
sudo cp libmytest.so /usr/lib //一定要加sudo
(3)测试动态库的使用,在main.c所在的文件目录下
gcc main.c -L. -lmytest
最后输出两数相乘之积;