目录
一、hello实例
(1)准备源程序
hello.h
hello.c
main.c
(2)将hello.c编译成.o文件
静态库和动态库都是由.o文件创建的,因此需要把hello.c文件编译成.o文件
gcc -c hello.c
(3) 由.o文件创建静态库
静态库的命名规范是以lib为前缀,紧接着跟静态库名,拓展名为.a。创建静态库用ar命令。
(4)在程序中使用静态库
方法一:gcc -o hello main.c -L. -lmyhello
方法二:gcc main.c libmyhello.a -o hello
方法三:先生成main.o:gcc -c main.c
再生成可执行文件:gcc -o hello main.o libmyhello.a
在删除静态库之后,程序照常运行,说明静态库中的公用函数hello已经连接到目标文件hello中 .
(5)由.o文件创建动态库文件
动态库文件名命名也是在动态库名增加前缀lib,但其文件扩展名为.so。用gcc来创建动态库。
gcc -shared -fPIC -o libmyhello.so hello.o
(6)在程序中使用动态库
gcc -o hello main.c -L. -lmyhello或gcc main.c libmyhello.so -o hello命令之后./hello会出错。,因为虽然连接时用的是当前目录的动态库,但运行时,是到usr/lib中找库文件的,所以需要将libmyhello.so复制到usr/lib目录中。
mv libmyhello.so /usr/lib
表示没有执行权限,可以用sudo解决
(7)静态库与动态库同名时的优先使用
先删除.c和.h外的所有文件
创建静态库文件libmyhello.a和动态库文件libmyhello.so
静态库文件libmyhello.a与动态库文件.so均已生成
使用库生成可执行文件
提示错误表示,当静态库与动态库同名时,gcc命令将优先使用动态库。
二、例A
(1)准备文件
A1.c
A2.c
A.h
test.c
(2)静态库.a文件的生成和使用
生成目标文件:gcc -c A1.c A2.c
生成静态库.a文件
使用.a库文件创建可执行程序
(3)共享库.so文件的生成与使用
生成共享库.so文件
使用.so库文件创建可执行程序
三、例x2x,x2y
(1)准备程序
sub1.c
sub2.c
sub.h
main.c
将sub1.c 与sub2.c编译成.o文件
(2)静态库.a文件的生成和使用
ar crv libsub.a sub1.o sub2.o
gcc -o main main.c libsub.a
(3)动态库.so文件的生成和使用
gcc -shared -o -fPIC -o libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so
sudo mv libsub.so /usr/lib
(可以使用rm指令把不用的文件删掉)
(4)静态库与动态库文件大小的对比
静态库
动态库
可见动态库要比静态库大。
四、总结
通过练习熟练掌握静态库文件与动态库文件的生成。