目录
一、用gcc生成静态库和动态库
(一)使用示例1
(二)使用示例2
(三)使用示例3
二、总结
静态库和动态库的定义
静态库
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
(一)使用示例1
1.源程序
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
hello.c
#include
void hello(const char *name)
{
printf("Hello %s!\n", name);
}
main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
gcc编译
2.静态库的使用
(1)以.o文件创建静态库
ar -crv libmyhello.a hello.o
1)创建静态库用 ar 命令。
2)静态库文件名的命名规范是以 lib 为前缀,紧接着跟静态库名,扩展名为.a。
(2)在程序中使用静态库
1)方法一
gcc -o hello main.c -L. –lmyhello
自定义的库时,main.c 还可放在-L.和 –lmyhello 之间,但是不能放在它俩之后,否则会提
示 myhello 没定义,但是是系统的库时,就不出错。
2)方法二
gcc main.c libmyhello.a -o hello
3)方法三
gcc -c main.c
gcc -o hello main.o libmyhello.a
(3)验证静态库的特点
在删除静态库的条件下,运行可执行文件,程序照常运行,说明静态库中的公用函数已经连接到目标文件中了。
3.动态库的使用
(1)以.o文件创建动态库
gcc -shared -fPIC -o libmyhello.so hello.o (-o 不可少)
注:shared:表示指定生成动态链接库,不可省略
-fPIC:表示编译为位置独立的代码,不可省略
(2)在程序中使用动态库
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
我们将文件 libmyhello.so 复制到目录/usr/lib 中,再次进行尝试,程序成功运行。
4.静态库与动态库比较
rm -f hello hello.o /usr/lib/libmyhello.so
gcc -c hello.c
ar -cr libmyhello.a hello.o (或-cvr )
gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. –lmyhello
先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态;再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so。
注:在删除时,提醒我们权限不够,通过sudo进行删除就好了。下面同理。
在执行可执行文件,会报一个错误,可见当静态库和动态库同时存在的时候,程序会优先使用动态库。
(二)使用示例2
1.源程序
A1.c
#include
void print1(int arg)
{
printf("A1 print arg:%d\n",arg);
}
A2.c
#include
void print2(char *arg)
{
printf("A2 printf arg:%s\n",arg);
}
A.h
#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif
test.c
#include
#include"A.h"
int main()
{
print1(1);
print2("test");
return 0;
}
gcc编译
2.程序中使用静态库
ar crv libfile.a A1.o A2.o
gcc -o test test.c libfile.a
3.动态库的使用
gcc -shared -fPIC -o libfile.so A1.o A2.o
gcc -o test test.c libfile.so
(三)使用示例3
1.源程序
sub1.c
float x2x(int a,int b)
{
float c=0;
c=a+b;
return c;
}
sub2.c
float x2y(int a,int b)
{
float c=0;
c=a/b;
return c;
}
sub.h
#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif
main.c
#include
#include"sub.h"
void main()
{
int a,b;
printf("Please input the value of a:");
scanf("%d",&a);
printf("Please input the value of b:");
scanf("%d",&b);
printf("a+b=%.2f\n",x2x(a,b));
printf("a/b=%.2f\n",x2y(a,b));
}
gcc编译
gcc -c sub1.c sub2.c
2.静态库
ar crv libsub.a sub1.o sub2.o
gcc -o main main.c libsub.a
3.动态库
gcc -shared -fPIC libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so
4.静态库与动态库生成文件比较
通过比较发现静态库要比动态库要小很多,生成的可执行文件大小也存在较小的差别。
二、总结
通过实例演示对静态库和动态库的创建和使用,充分了解其建立过程和运行结果,能更好的对知识进行掌握并加深印象,静态库与动态库的让我们对其优先级有了很好的了解,在整体过程中遇到一些问题,通过查询资料并加以改正,最终成功解决,并在此过程中受益良多。