gcc生成静态库.a和动态库.so
一、gcc生成静态库
1.hello实例使用库
准备过程:
1.创建一个目录
2.hello代码
hello.h
#ifndef HELLO1_H
#define HELLO1_H
void hello(const char *name);
#endif//HELLO_H
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s\n",name);
}
main.c
#include"hello1.h"
int main()
{
hello("everyone");
return 0;
}

gcc编译得到.o文件
gcc -c hello1.c

2.静态库使用
- 创建静态库
a.创建静态库的工具:ar
b.静态库文件命名规范:以lib作为前缀,是.a文件
c.代码如下ar -crv libmyhello.a hello1.o

- 程序中使用静态库,有两种方法。
①gcc -o hello1 main1.c -L. -lmyhello

②gcc main1.c libmyhello.a -o hello1

- 验证静态库的特点
首先,使用命令rmlibmyhello.a删除静态库,然后运行程序。
./hello1
在删掉静态库的情况下,运行可执行文件,发现程序仍旧正常运行,表明静态库跟程序执行没有联系。同时,也表明静态库是在程序编译的时候被连接到代码中的。

二、生成动态库
- 创建动态库
创建动态库的工具:gcc
动态库文件命名规范:以lib作为前缀,是.so文件
gcc -shared -fPIC -o libmyhello.so hello1.o

- 在程序中执行动态库
gcc -o hello main.c -L. -lmyhello
gcc main.c libmyhello.so -o hello

将libmyhello.so复制到目录/usr/lib中。由于运行时,是在/usr/lib中找库文件的。
注:需获取超级管理员权限。
mv libmyhello.so /usr/lib

最后,可以运行hello1。

使用示例:
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;
}
sub1.h
#ifndef SUB1_H
#define SUB1_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif
main.c
#include"sub1.h"
int main()
{
int a,b;
a=2;
b=3;
float c1,c2;
c1=x2x(a,b);
c2=x2y(a,b);
printf("%.2f\n",c1);
printf("%.2f\n",c2);
return 0;
}
输入命令编译:gcc -c sub1.c sub2.c
编译后生成目标.o文件。

静态库示例使用
输入如下命令
ar crv libsub.a sub1.o sub2.o

生成.o文件
gcc -o main main.c libsub.a
输入./main程序运行成功。

动态库示例使用
- 与动态库使用类似。
输入如下命令
gcc -shared -fPIC -o libsub.so sub1.o sub2.o

生成.o文件
gcc -o main main.c libsub.so

同样,需要移动生成的.so文件,然后输入./main程序运行成功。

通过比较发现静态库要比动态库要小很多,生成的可执行文件大小也存在较小的差别。
总结
通过这次实验,我们可以了解到静态库与动态库的区别以及使用方法。
参考文献:
gcc生成静态库.a和动态库.so以及opencv的安装及使用示例
996

被折叠的 条评论
为什么被折叠?



