Linux生成动态库.so与生成静态库.a

动态库共享库

第一步:通过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体积变大


你可能感兴趣的:(杂谈)