文件列表:
----show1.c
----show2.c
----show3.c
----test.c
文件关系:show1.c 和show2.c 生成libshow.a 静态库;show3.c 生成libshow3.so动态库,show3.c调用show1.c和show2.c的API;test.c调用show3.c的API。
文件内容如下:
文件1:show1.c
#include <stdio.h>
void show1(void)
{
printf("show1\n");
}
文件2:show2.c
#include <stdio.h>
void show2(void)
{
printf("show2\n");
}
文件3:show3.c
void show1(void);
void show2(void);
void show3(void)
{
show1();
show2();
}
文件4:test.c
#include "stdio.h"
void show3(void);
int main()
{
show3();
return 0;
}
生成静态库libshow.a:
$ gcc -c -o show1.o show1.c
$ gcc -c -o show2.o show2.c
$ ar -rv libshow.a show1.o show2.o
生成动态库libshow3.so:
$ gcc -shared -o libshow3.so show3.c -lshow -L ./
生成libshow3.so时需要链接libshow.a库,所以添加选项-lshow -L ./
安装libshow.a 和 libshow3.so 到系统库目录,并更新链接文件。
$ cp libshow* /usr/local/lib/
# ldconfig
编译测试文件并测试:
$ gcc -o test test.c -lshow -lshow3
# ./test
show1
show2
删除libshow.a后程序可执行:
# rm /usr/local/lib/libshow.a
# ldconfig
# ./test
show1
show2
删除libshow3.so后程序不可执行:
# rm /usr/local/lib/libshow3.so
# ldconfig
# ./test
./test: error while loading shared libraries: libshow3.so: cannot open shared object file: No such file or directory
附加:Linxu静态库链接顺序
平时经常遇到编译文件 -lxxx库时, 提示未定义xxxxx。然后你把各个库链接的顺序更换一下,编译就可以通过了,也一直没深究原因。今天查了一下。
比如说我们大家所熟知的libjpeg库他是依赖于libz库的,如果我们有两个库的静态库libjpeg.a 和 libz.a ,那么我们在编译程序时链接 jpeg库时,同时需要链接 libz库。顺序为: -ljpeg -lz