一、用gcc生成静态库和动态库
(1)编辑生成程序 hello.h、hello.c 和 main.c
hello.h:
#ifndef HELLO_H
#define HELLO_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 "hello.h"
int main()
{hello("everyone"); return 0; }
(2) 将 hello.c 编译成.o 文件
输入如下命令
# gcc -c hello.c
利用ls命令进行查看是否生成了 hello.o 文件
`(3) 由.o 文件创建静态库
输入如下命令
# ar -crv libmyhello.a hello.o
利用ls命令进行查看是否生成了 libmyhello.a 文件
(4) 在程序中使用静态库
输入如下命令
# gcc -o hello main.c -L. –lmyhello
显示如下:
这是因为自定义的库时,并非系统的库。
再输入如下命令
#gcc main.c libmyhello.a -o hello
# ./hello
显示如下:
或者输入如下命令:
先生成 main.o:
gcc -c main.c
再生成可执行文件:
gcc -o hello main.o libmyhello.a
# ./hello
显示如下:
删除静态库文件验证公用函数 hello 是否真的连接到目标文件 hello 中,过程如下:
输入如下命令
# rm libmyhello.a rm: remove regular file `libmyhello.a'? y # ./hello
(5) 由.o 文件创建动态库文件
输入如下命令
# gcc -shared -fPIC -o libmyhello.so hello.o
由于本人用的是ubuntu16,从hello.c 生成 hello.o,需要将 gcc -c hello.c 换成 gcc -fpic -c hello.c之后才不会出错,如下:
(6)在程序中使用动态库
# gcc -o hello main.c -L. -lmyhello
此时出错提示找不到动态库文件 libmyhello.so
解决方法是将文件 libmyhello.so 复制到目录/usr/lib 中再来一次,如下:此时需要管理员权限,即需要输入密码即可。
(7)当静态库和动态库同名时验证GCC使用静态库还是动态库如下:
先删除除.c 和.h 外的所有文件,再输入命令
此时需要管理员权限,即需要输入密码即可。
再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so
# gcc -c hello.c
# ar -cr libmyhello.a hello.o
# gcc -shared -fPIC -o libmyhello.so hello.o
运行 gcc 命令来使用函数库 myhello 生成目 标文件 hello,并运行程序 hello
输入命令
# gcc -o hello main.c -L. –lmyhello
显示如下:
此时所遇到的问题解决方法与上一步第六步相同,不再赘述。
二、静态库.a与.so库文件的生成与使用
(1)编辑生成所需要的四个文件 A1.c 、 A2.c、 A.h、 test.c
A1.c:
#include <stdio.h>
void print1(int arg)
{ printf("A1 print arg:%d\n",arg); }
A2.c:
#include <stdio.h>
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 <stdlib.h>
#include "A.h"
int main()
{ print1(1); print2("test"); exit(0); }
(2) 静态库.a 文件的生成与使用
生成目标文件(xxx.o)
# gcc -c A1.c A2.c
显示如下:
生成静态库.a 文件
# ar crv libafile.a A1.o A2.o
显示如下:
使用.a 库文件,创建可执行程序
# gcc -o test test.c libafile.a
#./test
显示如下:
(3)共享库.so 文件的生成与使用
生成目标文件(hello.o)
# gcc -fpic -c hello.c
# gcc -c -fpic A1.c A2.c
显示如下:
生成共享库.so 文件
# gcc -shared -fpic -o libsofile.so A1.o A2.o
使用.so 库文件,创建可执行程序
# gcc -o test test.c libsofile.so
# ./test
显示如下:
出现错误,是找不到对应的.so 文件
运行 ldd test,查看链接情况
# ldd test
显示如下:
此时需将对应 so 文件拷贝到对应路径
sudo cp libsofile.so /usr/lib
显示如下:
三、自主设计一个库的链接
(1)编辑生成所需要的四个g文件 sub1.c 、 sub2.c、 sub1.h、 main1.c
sub1.c:
#include"sub1.h"
float x2x(int a,int b)
{
return a+b;
}
sub2.c:
#include"sub1.h"
float y2y(int a,int b)
{
return a*b;
}
sub1.h:
float x2x(int a,int b);
float y2y(int a,int b);
main1.c:
int main()
{
int a,b;
float c,d;
a=1;
b=2;
c=x2x(a,b); //调用自定义头文件里的x2x函数
d=y2y(a,b); //调用自定义头文件里的y2y函数
printf("%f\n%f\n",c,d);
}
(2) 静态库.a 文件的生成与使用
生成目标文件(sub1.o、sub2.o)
# gcc -c sub1.c sub2.c
显示如下:
生成静态库.a 文件
# ar crv libsubfile.a sub1.o sub2.o
显示如下:
使用.a 库文件,创建可执行程序
# gcc -o main1 main1.c libsubfile.a
#./main1
显示如下:
此时查看文件大小,显示如下:
(3)共享库.so 文件的生成与使用
生成目标文件(main1.o)
# gcc -fpic -c main1.c
# gcc -c -fpic sub1.c sub2.c
显示如下:
生成共享库.so 文件
# gcc -shared -fpic -o libsubfile.so sub1.o sub2.o
使用.so 库文件,创建可执行程序
# gcc -o main1 main1.c libsubfile.so
# ./main1
显示如下:
此时查看文件大小,显示如下:
总结
本篇文章主要介绍了简单的ubantu下库文件的生成与使用。