目录标题
前言
函数库分为静态库和动态库两种。静态库在程序编译的时候会被连接到目标代码中,程序运行时将不再需要该静态库。而动态库在程序编译时并不会被连接到目标代码中,而是运行程序时才被载入,因此在运行程序时还需要动态库存在。
一、gcc生成.a静态库和动态库
1、编译生成hello.h、hello2.c、main2.c三个程序
启动Ubuntu,打开终端,输入如下命令:
mkdir
(Make Directory,创建目录):若指定目录不存在则创建目录;用法:mkdir 目录名
,输入ls
命令可查看。
cd
(change directory,改变目录):①cd
回到用户主目录;②cd 目录名
使用该命令进入文件目录
然后输入命令vim hello.h
进入编辑器,按下“i”键进入字母输入模式
按下“Esc”键,然后输入“:wq”,再按下回车键,即可保存项目并返回开始界面。
接着输入命令vim hello2.c
进入编辑器,按下“i”键进入字母输入模式
按下“Esc”键,然后输入“:wq”,再按下回车键,即可保存项目并返回开始界面。
然后输入命令vim main2.c
进入编辑器,按下“i”键进入字母输入模式
按下“Esc”键,然后输入“:wq”,再按下回车键,即可保存项目并返回开始界面。
2、将hello.c编译成.o文件
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件,在系统提示符下键入以下命令得到hello.o文件。
输入gcc -hello.c
命令得到hello.o文件
运行ls
命令查看是否生成了hello.o文件
3、由.o文件创建静态库
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库命名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用
ar
命令。
输入ar -crv libmyhello.a hello.o
命令创建静态库文件libmyhello.a。
运行ls
命令查看是否生成了该文件
4、在程序中使用静态库
要使用静态库内部的函数,就需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从静态库中将公用函数连接到目标文件中。注意,gcc 会在静态库名前加上前缀 lib,然后追加扩展名.a 得到的静态库文件名来查找静态库文件。在程序 3:main.c 中,我们包含了静态库的头文件 hello.h,然后在主程序 main 中直接调用公用函数 hello。
下面先生成目标程序 hello,然后运行 hello 程序看看结果如何。
输入gcc -o hello main.c -L. -lmyhello
命令
自定义的库时,main.c 还可放在-L.和 –lmyhello 之间,但是不能放在它俩之后,否则会提示 myhello 没定义,但是是系统的库时,如 g++ -o main(
-L/usr/lib) -lpthread main.cpp就不出错。
我们删除静态库文件试试公用函数 hello 是否真的连接到目标文件 hello 中了。
程序照常运行,静态库中的公用函数已经连接到目标文件中了。
5、由.o文件创建动态库文件
我们继续看看如何在 Linux 中创建动态库。我们还是从.o 文件开始。
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是 libmyh ello.so。用 gcc 来创建动态库。
在系统提示符下键入以下命令得到动态库文件libmyhello.so。
6、在程序中使用动态库
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。
我们先运行 gcc 命令生成目标文件,再运行它看看结果。
错误提示找不到动态库文件libmyhello.so。
程序在运行时,会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
我们将文件 libmyhello.so 复制到目录/usr/lib 中。
提示权限不够,就在命令前面加上
sudo
命令
成功了,这说明动态库在程序运行时是需要的。
二、Linux下静态库.a与.so文件的生成与使用
1、编译生成四个相关文件
输入mkdir homework2
命令创建新的目录
A1.c
A2.c
A.h
test.c
2、程序中使用静态库
输入gcc -c A1.c A2.c
,ls
命令可进行查看
图中报错,输入
vim test.c
命令进入编辑器,将exit(0)改成return 0。
-L.:表示在当前目录下,可自行定义路径 path,即使用-Lpath 即可。
-lname:name:即对应库文件的名字(除开 lib),即若使用 libafile.a,则 name 为 afile;若要使用 libsofile.so,则 name 为 sofile)。
3、动态库的使用
gcc -shared -fPIC -o libfile.so A1.o A2.o
gcc -o test test.c libfile.so
三、程序改编
1、程序
键入vim 文件名
进入编辑器
sub1.c
sub2.c
sub.h
main.c
gcc -c sub1.c sub2.c
2、静态库
ar crv libsub.a sub1.o sub2.o
注意此处是.o文件
3、动态库
gcc -shared -fPIC -o libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so
4、静态库与动态库的生成文件的比较
静态库
动态库
通过比较发现静态库要比动态库要小很多,生成的可执行文件也存在差异。
四、总结
通过对比练习生成动态库和静态库,能够发现两者在运用和文件大小上都有一定的差别。在输入命令的时候区分清除文件的后缀可以有效减小错误率。注意创建新的文件的位置。由于 linux 自身系统设定的相应的设置的原因,即其只在/lib and /usr/lib 下搜索对应的.so 文件,故需将对应 so 文件拷贝到对应路径。
五、参考文献
http://t.csdn.cn/ckvSl
http://t.csdn.cn/MOf4A
http://t.csdn.cn/fN2RZ