1.静态库
-
命名方式
lib+库名字+.a
eg:libMytest.a -
制作静态库步骤
1>把所有的.c文件生成.o的二进制文件(防止用户看见源码)
gcc *.c -c
2>将生成的.o文件打包
ar rcs 生成静态库的名字(libMytest.a) 依赖的所有.o文件 -
发布
制作的静态库和头文件(包含函数的接口)//这样用户就只有接口和二进制代码,规避了源码实现的方法. -
调用静态库的方式:
1>gcc main.c -I include -L lib -l Mytest -o myapp //用户自己写的main.c编译时调用静态库 -I 指定头文件 -L指定调用库 -l指定调用哪个静态库(掐头去尾,不用写libMytest.a)
2>gcc main.c lib/libMytest.a -o myapp -I include //-I指定头文件,lib/libMytest.a是静态库 -
静态库的优缺点
优点
1>编译的时候静态库中用到的相应程序段就打包到程序中,所示使用静态库编译的程序发布时,不需要提供对应的库;
2>加载库的速度快
缺点
1>库中被使用的代码段被打包到程序中,导致程序体积变大
2>库发生改变就需要重新编译
2.共享库
- 命名方式
lib+库名字+.so
eg:libMytest.so
-
制作动态库步骤
1>把所有的.c文件生成.o的二进制文件,且与位置无关(防止用户看见源码)
gcc -fPIC *.c -c -I …/include //-fPIC生成与位置无关的.o -I指定头文件
2>将生成的.o文件打包成动态库
gcc -shared -o libMytest.so *.o -I include -
发布
制作的动态库和头文件(包含函数的接口)//这样用户就只有接口和二进制代码,规避了源码实现的方法. -
调用静态库的方式:
1>gcc main.c -I include -L lib -l Mytest -o myapp //用户自己写的main.c编译时调用动态库 -I 指定头文件 -L指定调用库 -l指定调用哪个动态库(掐头去尾,不用写libMytest.so)
2>gcc main.c lib/libMytest.so -o myapp -I include //-I指定头文件,lib/libMytest.so是动态库o
注意:编译的时候会报错找不到动态链接库以下方法可以使其找到(ldd 执行程序名字 //查看动态链接库的链接情况):
1>将自己的动态库拷贝到 /lib (此方法会存在重名的风险,不推荐)
2>终端输入 export LD_LIBRARY_PATH=当前动态链接库的地址 //export 输出当前变量 但是这个方法只是临时的,当当前的终端关闭后,LD_LIBRARY_PATH的值就消失了
3>export LD_LIBRARY_PATH=当前动态链接库的地址 写入.bashrc里面 然后 source .bashrc 就是永久设置了(因为终端每次启动的时候都会读取.bashrc文件)
4> 将动态库的链接放入动态连接器的配置文件(/etc/ld.so.conf)中然后更新(sudo ldconfig -V)
优点
1>库中被使用的代码段不会被打包到程序中,只是会做个标记,直接去调用,所以程序体积小
2>库发生改变不需要重新编译
缺点
1>编译的时候动态库中用到的相应程序段没有被打包到程序中,只是做了标记,所示使用动态库时,需要提供对应的库;
2>加载库的速度相对于静态库较慢一点.