目录
一.gcc 生成 .a 静态库和 .so 动态库
编译生成hello.h,hello.c,main.c
1.打开虚拟机Ubuntu的终端,在合适的位置创建文件test1
代码如下:
mkdir test1//创建文件夹test1
cd test1//打开文件夹tes1
2.用Vim编辑器新建一个hello.c文件
vim hello.c
3.按a进入插入模式,输入代码,按esc后输入:wq,保存并退出
4.新建hello.h文件
vim hello.h
5.以同样的方式新建main.c文件
vim main.c
将hello.c编译为.o文件并创建静态库并在程序中使用静态库
1.使用工具gcc,输入命令gcc -c hello.c
2.使用命令 ls看看是否生存了 hello.o 文件
3.发现已经生成hello.o文件
4.输入命令创建静态库
ar -crv libmyhello.a hello.o
5.用ls查看静态库,可看到已经成功
6.输入命令
gcc main.c libmyhello.a -o hello
7.运行程序./hello,查看运行结果,输出hello everyone!,表示成功
由.o 文件创建动态库文件并 在程序中使用动态库
1.输入创建动态库命令
gcc -shared -fPIC -o libmyhello.so hello.o
2.输入ls命令查看创建结果
3.输入命令
gcc main.c libmyhello.so -o hello
4.输入命令./hello运行发现出错
5.原因分析
错误提示,找不到动态库文件 libmyhello.so。程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提 示类似上述错误而终止程序运行。我们将文件 libmyhello.so 复制到目录/usr/lib 中。
6.问题解决途径
用管理员权限,将 libmyhello.so 复制到目录/usr/lib
输入命令sudo cp -i libmyhello.so /usr/lib
输入密码后再次输入./hello运行,这次成功输出
静态库和动态库同名时,gcc 命令调用库文件情况
1.先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态
rm -f hello hello.o /usr/lib/libmyhello.so
2.提示无法删除,原因是权限不够,用管理员权限删除
sudo rm -f hello hello.o /usr/lib/libmyhello.so
3.用ls命令查看该文件夹下的所有文件,不存在hello、hello.o表示删除成功
4.再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so
(1)创建静态库文件
ar -cr libmyhello.a hello.o
(2)创建动态库文件
gcc -shared -fPIC -o libmyhello.so hello.o
5.结论
动态库和静态库同时存在时,优先使用动态库,如果直接使用命令gcc main.c libmyhello.a -o hello 的话,就是指定静态库,从程序 hello 运行的结果中很容易知道,当静态库和动态库同名时,gcc 命令将优先使用动 态库,默认去连/usr/lib 和/lib 等目录中的动态库,将文件 libmyhello.so 复制到目录/usr/lib 中即可。
二.Linux 下静态库.a 与.so 库文件的生成与使用
静态库.a 文件的生成与使用
1.新建文件夹test2,并打开
2.新建c语言文件A1.c,使用工具Vim文本编辑器
3.以同样的方法创建c语言文件A2.c
4.同样方式创建文件A.h
5.新建c语言文件test.c
6.生成目标文件并用ls命令查看
gcc -c A1.c A2.c
7.生成静态库.a 文件
ar crv libafile.a A1.o A2.o
8.使用.a 库文件,创建可执行程序
gcc -o test test.c libafile.a
运行程序./test输出
三.自建函数静态库.a 与.so 库文件的生成与使用
静态库.a 文件的生成与使用
1.分别生成文件x2x.c,x2y.c,x.h,main.c
x2y.c代码
#include<stdio.h>
float f2(int a,int b){
float i;
i=a*b;
printf("This is x2x.c!\n");
return i;
}
2.生成目标文件
gcc -c x2x.c x2y.c
3.输入ls查看
4.生成静态库.a 文件,使用.a 库文件,创建可执行程序,运行程序main输出
./main
共享库.so 文件的生成与使用
1.、生成目标文件(.o文件)
2.生成共享库.so 文件
gcc -shared *.o -o xy.so
3.使用.so 库文件,创建可执行程序
gcc -o main main.c xy.so
4执行./main报错
5.解决思路:
用管理员权限,将xy.so 复制到目录/usr/lib
输入命令sudo cp -i xy.so /usr/lib,根据提示输入密码
再次输入./main
6.删除/usr/lib下的xy.so动态库
sudo rm -f /usr/lib/xy.so
四.总结
通过此次的学习,了解到了生成动态库及静态库文件的基础知识,并意识到当动态库和静态库重名时会优先使用动态库,这时需要把/lib下的动态库文件拷贝到urs\lib下才能正常使用。