一、库函数
什么是库函数:库在linux中以二进制的形式存在,在编译的时候需要链接这些库文件库函数的作用:库文件是一些函数的集合,将我们函数的具体内容进行封装,仅对外提供一个调用的接口,给用户使用(即用户不需要知道函数是如何实现的,只需要调用即可)库分类:1、静态库(.a文件): libxxx.a 编译的时候,把这个函数链接到可执行程序里去,编译后的可执行文件较大2、动态库(.so文件):libxxx.so 编译的时候,没有将函数体链接到可执行程序中,而是把一些符号链接起来,在运行的时候再加载对应的函数。
二、库函数的制作
首先先了解一下编译的过程:分为 4个 过程预处理 gcc -E hello.c -o hello.i //将宏定义展开、文件包含、删除部分代码等编译 gcc -S hello.i -o hello.s //将C程序翻译成机器的汇编语言汇编 gcc -c hello.s -o hello.o //编译、汇编制定的源文件,但是不进行链接连接 gcc hello.o -o hello //将.o文件链接成一个可执行文件
静态库的制作:1、首先将需要制作成库文件的函数编译一下:gcc -c add.c (此时会生成对应的add.o文件)2、将生成的add.o文件封装到库文件libmylib.a中ar -rcs libmylib.a add.o (ar 指令是专门用于对库来进行操作的) 使用静态库来进行编译(链接)程序:gcc hello.c -L . -lmylib或者gcc hello.c -L . libmylist.a注意:如果不使用-l 指定使用什么库文件,而是直接使用的话,需要将该库文件的路径一并打出来,如果是在当前文件夹下,则不需要。其中 -L 后跟着库文件路径 -l(小写L)为库文件libxxx.a中xxx的名字,若不使用-l则输入库文件全称,如果提示信息缺少头文件则可以加上-I (大写i)头文件路径
动态库的制作:1、首先将需要制作成库文件的函数编译一下:gcc -c add.c (此时会生成对应的add.o文件)2、将生成的add.o打包生成一个动态库gcc -shared -fPIC -o libmylib.so add.o (-shared 共享对象文件,-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码)使用动态库来进行编译(链接)程序gcc hello.c -o hello -L . -lmylib或者gcc hello.c -L . libmylist.so
三、在使用库函数(链接)编译程序时需要注意的事项
在使用动态库的时候,编译好后,如果直接运行程序会报错(原因是查找不到动态库)解决方法:1、直接将自己的动态库 移动到 /lib 或者 /usr/lib 中2、修改环境变量 LD_LIBRARY_PATH :通过修改 家目录下 .bashrc 或者 /etc/profile 来添加动态库路径如: export LD_LIBRARY_PATH=/home/gec/lib:$LD_LIBRARY_PATH然后 source .bashrc (使其立即生效)3、通过修改/etc/ld.so.conf(添加的路径为最优先路径)在ld.so.conf 中 添加 /home/gec/lib保存后执行 ldconfig