Linux下的静态库和动态库 - yg2362 - C++博客
1. 制作自己的动态库和静态库
linux 下动态库以 .so 结尾,静态库以 .a 结尾,它们都以 lib 开头,比如一个库名为 net, 那么它的全名应该是 libnet.so 或者 libnet.a 。
我们有两个文件, hello.c 和 test.c ,下面是两个文件的内容
//hello.c
#include <stdio.h>
void my_lib_func()
{
printf("Library routine called\r\n");
}
//test.c
#include <stdio.h>
int main()
{
my_lib_func();
return 1;
}
test.c 调用了 hello.c 的方法,我们把 hello.c 封装成库文件。无论是静态库还是动态库,都是由 .o 文件组成,我们先把 gcc -c hello.c 生成 .o 文件
制作静态库
ar crv libmyhello.a hello.o, ar 是生成静态库的命令,libmyhello.a是我的静态库名。下一步就是在我的程序中使用静态库
可以看到已经有了Library routine called的结果,说明调用成功了。
下面我们删除 libmyhello.a, 看看程序是否还是运行正常
我们发现程序依然运行正常,说明静态库已经连接进入我们的程序中
制作动态库
我们看见动态库 libmyhello.so 已经生成,下面继续使用
找不到库文件,这个时候我们把 so 文件拷贝到 /usr/lib 下面
运行成功
2. 动态库和静态库同时存在的调用规则
我们可以发现,不论是动态库还是静态库,程序编译连接的时候都是加的参数 -l ,那么当他们同时存在的时候,程序会选择动态库还是静态库呢。我们做个尝试。
我们同时存在 libmyhello.a 和 libmyhello.so ,我们发现运行的时候,出现找不到动态库的错误,由此,我们可以得出结论,同时存在动态库和静态库的时候, gcc 会优先选择动态库