linux系统下的应用编程需要系统提供的库文件,包括静态库或动态库。不管是静态库还是动态库,都是编译好的二进制文件。在我们编译程序时要链接的目标文件,静态库是链接的时候直接编译到程序里,和程序成为一体,因此程序代码的体积较大,而动态库链接之后,库文件和程序不为一体,只有在代码运行时才会找相应的库文件进行链接,故而代码体积小,运行速度更快。
接下来我就将linux系统下的静态库和动态库的制作过程,做个简单的介绍。
一、静态库的制作
1.如下图所示,编写示例工程代码dayin.c 、dayin.h、test.c
其中dayin.c文件为要封装的静态库源码,dayin.h文件存放功能函数的申明,test.c是要验证静态库功能的源码文件
2.编译功能源码文件,生成dayin.o目标文件:gcc -c dayin.c
3.执行命令生成静态库文件:ar crs libdayin.a dayin.o
4.编译生成测试程序test:gcc -o test test.c -L. -ldayin (-L.为指定静态库的路径,.为当前目录下)
5.删除静态库文件之后,能够再此正常运行
二、动态库制作过程
1.编写制作动态库的示例工程代码shuru.c shuchu.c head.h main.c
2.编译功能模块shuru.c和shuchu.c生成与路径无关的目标文件:gcc -c -fPIC shuru.c shuchu.c
3.生成动态库文件:gcc -shared -o libdongtai.so.1 shuru.o shuchu.o
4.创建动态库的软连接:ln -s libdongtai.so.1 libdongtai.so
5.编译测试程序:gcc -o main main.c -L. -ldongtai
6.运行可执行性文件时,会报错误,因为没有添加环境变量,下面有三种解决方案。
错误信息:./main: error while loading shared libraries: libdongtai.so: cannot open shared object file: No such file or directory
1)添加临时的环境变量,只在当前终端有效:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
2)把生成的动态库文件和软连接拷贝到/usr/lib下或/lib下,不过一般不建议这种操作,因为两个目录下一般为系统的库文件所在的路径。
3)添加配置文件:在/etc/ld.so.conf.d/下添加my.conf文件,加入库所在的路径:/home/lolors/test/library1/
添加完毕后,刷新:ldconfig即可。