一、库
1、库就是一段可加载到内存中执行的二进制编码(可以理解为写函数的人将函数只编译不链接生成二进制的目标文件,这些目标文件的集合就是库,这样没人能知道函数的具体实现,可以很好地保护作者的知识产权)
2、库的作用:提高代码的复用率,节省资源(有些功能在一个程序中会多次使用,通过库我们可以直接调用别人写好的函数,而不用在每个程序中重复写同样的函数,这样可以节省空间)
3、库的分类:(1)静态库(在程序编译的时候链接,直接将函数的目标代码复制到程序当中,最终生成的可执行文件离开库,也可以运行,代码执行效率比动态库好。但是代码体量变大)
(2)动态库(程序编译好后,在程序运行到函数位置时,再链接,没有相应的库,可执行文件无法执行,但调试更方便,函数出了问题,可以直接改函数库,可执行文件随着改变,而静态库做不到)
liunx下的静态库:libxxx.a libxxx.so(动态库)
Windows下的静态库:.dll .lib(动态库)
4、库的制作:(1)静态库的制作
gcc 源文件 -c (只编译不链接,生成文件后缀为.o的目标文件)
ar crv lib库名.a +所有需要加载到静态库的目标文件(c表示创建,v表示显示过程,与tar归档命令的选项相似)
(2)静态库的使用
在编译时加选项进行配置 (gcc main.c -L ./ -l func(在编译时链接当前路径下的func静态库))
-L 指定库的路径
-l 指定库的名字
(3)动态库的制作
gcc -fPIC -c 源文件 (生成与地址无关的编译程序,这样当动态库需要链接的时候,我们可以在任何地方找到使用动态库中的函数)
gcc -shared -o libxx.so +所有的目标文件
(4)动态库的使用
动态库创建好后一般无法直接使用,系统会提示找不到动态库
有三种解决方法:
第一种:将制作好的动态库放在liunx系统中管理库文件的路径/lib /usr/lib(这种方式需要管理员权限,不安全,不推荐)
第二种:配置动态库相关的环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:+动态库路径(这种事属于临时配置,重启则失效,不推荐)
第三种:修改配置文件,在/etc/ld.so.conf.d/目录下创建xx.conf,在该配置文件内添加动态库的路径
完成后要使用 sudo ldconfig 重启配置才能生效
动态库的使用方法与静态库相同 gcc +源程序 + -L +库的路径 + -l +库名