文章目录
一、编辑生成例子程序hello.h、hello.c和main.c
1.创建目录,保存本次练习的文件
输入命令mkdir test1
创建目录test1,输入命令cd test1
进入目录test1。
2.用vim编辑器编辑生成所需三个例子程序
输入命令vim 程序名称
按下Enter 键进入vim编辑器,再按下i键进入编辑模式,程序编写完成后按下Esc键退出编辑,再输入:wq保存编写的程序并退出vim编辑器。
(1)生成程序hello.h
(2)生成程序hello.c
(3)生成程序main.c
3.将hello.c编译成.o文件
输入命令gcc -c hello.c
得到hello.o文件,再运行命令ls
看是否生成了hello.o文件,在ls命令结果中,若看到hello.o文件,则本步操作完成,如下图:
二、静态库文件的创建及使用
1.由.o文件创建静态库文件
输入命令ar -crv libmyhello.a hello.o
创建静态库文件libmyhello.a,再运行命令ls
看是否生成了静态库文件libmyhello.a,在ls命令结果中,若看到libmyhello.a文件,则此步操作完成,如下图:
2.在程序中使用静态库
先生成目标程序hello,再输入命令./hello
运行hello程序看看结果如何。
(1)方法一:输入命令gcc -o hello main.c -L. -lmyhello
(注:自定义的库时,main.c还可以放在-L.和-lmyhello之间,但是不能放在它俩之后,否则会提示myhello没有定义,但是是系统的库时,如g++ -o main (-L/usr/lib) -lpthread main.cpp)就不会出错。
(2)方法二:输入命令gcc main.c libmyhello.a -o hello
(3)方法三:先生成main.o,再生成可执行文件并运行
三、动态库文件的创建及使用
1.由.o文件创建动态库文件
先输入命令gcc -shared -fPIC -o libmyhello.so hello.o
得到动态库文件libmyhello.so,再输入命令ls
查看动态库文件时是否生成,如下图:
2.在程序中使用动态库
先输入命令gcc -o hello main.c -L. -lmyhello
或者命令gcc main.c libmyhello.so -o hello
,无论用哪一个命令,接下来./hello都会提示出错,如下图:
由错误提示可以知道出错的原因是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
解决办法:输入命令sudo mv libmyhello.so /usr/lib
将文件libmyhello.so复制到目录/usr/lib中,再运行,如下图:
四、静态库和动态库的比较
当静态库文件和动态库文件重名时,gcc命令会优先使用哪个库文件呢?探究过程及结果如下:
先输入命令sudo rm -f hello hello.o main.o libmyhello.a /usr/lib/libmyhello.so
删除除.c和.h外的所有文件,恢复成刚刚编辑完例子程序的状态,如下图:
再次创建静态库文件libmyhello.a和动态库文件libmyhello.so,如下图:
生成目标文件hello并执行,如下图:
由此可知,当静态库文件与动态库文件同名时,gcc命令将优先使用动态库,默认去连/usr/lib和/lib等目录中的动态库,将文件libmyhello.so复制到目录/usr/lib中即可,如下图:
五、使用库文件的实例
1.创建目录,保存实例所需的文件
2.用vim编辑器编辑生成所需程序
(1)生成程序sub1.c
(2)生成程序sub2.c
(3)生成程序sub.h
(4)生成程序main.c
3.生成静态库文件与目标文件main链接并查看文件大小
(1)输入命令gcc -c main.c sub1.c sub2.c
生成三个.o文件,如下图:
(2)输入命令ar crv libyang.a sub1.o sub2.o
将sub1.o、sub2.o生成静态库文件libyang.a,如下图:
(3)输入命令gcc -o main main.c -L. -lyang
生成目标文件main,再输入命令./main
执行文件,如下图:
(4)输入命令ll
查看文件大小,如下图:
4.生成动态库文件与目标文件main链接并查看文件大小
(1)输入命令gcc -shared -fPIC -o libyang.so sub1.o sub2.o
将sub1.o、sub2.o生成动态库文件libyang.so,如下图:
(2)输入命令gcc -o main main.c -L. -lyang
生成目标文件main,输入命令sudo mv libyang.a /usr/lib
将文件libmyhello.a复制到目录/usr/lib中,再运行,如下图:
(3)输入命令ll
查看文件大小,如下图:
5.库文件大小的比较
静态库文件大小及其生成的可执行文件大小:
动态库文件大小及其生成的可执行文件大小:
由上面两图比较可知,静态库文件要比动态库文件要小很多,生成的可执行文件大小存在较少差异。
六、总结
通过这次练习,我知道了在程序中使用动态库和使用静态库完全一样,用gcc生成静态库文件.a和动态库文件.so的方法以及相关注意事项,不过,在练习过程中,我也遇到了一些小状况,例如程序编写的时候一个字母或者符号的偏差导致后面程序不能运行,输入命令的时候少写,多写或错写字母会导致执行错误,这就意味着大家在练习过程中一定要细心,这样才省时省力。