1、命名规则
静态库:lib+名称.a —> libSian.a
动态库:lib+名称.so —> libSian.so
2、静态库制作
准备目录:include、lib、src
头文件存放在include中,源文件存放在src中,库文件存放lib中
生成.o文件:在src目录中gcc -c *.c -I ../include // 大写i不是小写l
生成.a文件:ar rcs lib/libCalc.a src/*.o // 将src下的所有.o文件在lib目录下生成.a文件
利用静态库编译源文件:
gcc main.c lib/libCalc.a -o main.out -I include
gcc main.c -L lib -l Calc -I include // L库目录,l库名称(不带lib前缀)
整体目录结构及生成文件
├── include
├── lib
├── main.c
├── main.out
└── src
├── sub.c
├── sub.o
├── sum.c
└── sum.o
nm命令:nm lib/libCalc.a 可查看.a文件的内容,nm main.out同样可以查看
3、静态库的优缺点
优点:
编译时会根据需要以.o为单位包含库中的内容
发布程序时,不需要提供相对应的库(因为已经打包到应用程序中)
加载库时速度快
缺点:
4、动态库制作
生成与位置无关的.o文件
生成动态库.so文件
gcc -shared src/*.o -o lib/libCalc.so
使用动态库编译源文件
gcc main.c lib/libCalc.so -o main.out -I include // 方式一
gcc main.c -L lib -l Calc -o main1.out -I include // 方式二
两种方式都能生成可执行文件,但方式二生成的执行文件在执行时会报错,./main.out: error while loading shared libraries: libCalc.so: cannot open shared object file: No such file or directory
解决动态库无法找到的问题:
使用lld命令查看可执行文件:ldd main1.out
出现该问题的原因是无法通过环境变量找到动态库文件
方法一:将libCalc.so拷贝到/lib下即可解决;(不推荐)
方法二:export LD_LIBRARY_PATH=./lib 临时导入可以解决,当前终端生效;(临时)
方法三:如果需要每次打开时都有效,在~.bashrc文件的末尾行添加上述指令;(重启终端)
方法四:修改/etc/ld.so.conf文件,加入lib的绝对路径,sudo ldconfig -v更新 (建议)
5、动态库优缺点
优点:
动态库更新不需要更新源程序(接口不变情况下)
执行程序体积小,不需要打包到应用程序中
缺点:
发布程序时需要提供给用户
没有打包到应用程序中,执行效率相对慢一点
Post navigation
← gdb的基本使用
Makefile的基本使用 →