动态库共享库
第一步:通过gcc -fPIC -c 编译生成.o文件
gcc -fPIC -c a.c (编译生成.o文件 -fPIC与位置无关)gcc -fPIC -c b.c
生成a.o,b.o编译文件。
第二步:通过上面已经生成的a.o,b.o文件生成.so文件
方法1: gcc -shared -Wl -o liba.so a.o
方法2: gcc -shared -Wl,-soname,libab.so.1 -o libab.so.1.10 a.o b.o
第三步:通过依赖库编译生成可执行文件
main.c 引用已经生成的.so文件 libmyab.so.1.10
编译方法:gcc main.c libmyab.so.1.10 -o app
编译生成 app
运行 $ ./app
出错:error while loading shared libraries: libcalc.so.1: cannot open shared object file: No such file or directory
ldd察看依赖库:
$ ldd app
linux-gate.so.1 => (0xb77c8000)
libcalc.so.1 => not found <============注意
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb760c000)
/lib/ld-linux.so.2 (0xb77c9000)
注意点libcalc.so.1 => not found动态库没有找到
解决方法:把动态库路径添加到配置文件中:$ sudo vi /etc/ld.so.conf
更新动态库:$ sudo ldconfig -v
重新运行./app成功
生成so name : -Wl,-soname,libxxx.so.1
生成link name : ln -s libxxx.so.1.10 xxx.so
静态库
gcc -c -fPIC *.c
ar rcs libxx.a *.o
nm :察看文件包含内容
$ nm libcalc.a
add.o:
00000000 T add
dive.o:
00000000 T dive
mul.o:
00000000 T mul
sub.o:
00000000 T sub
编译:
$ gcc main.c lib/libcalc.a -o app
静态库和共享库的区别:
静态库优点:app随便放哪都可以运行
缺点:lib合入app导致app体积变大