原理:
将源码文件编译成自己的目标文件(即:从.c 文件编译成 .o文件)
然后通过不一样的链接方式,生成动态库(.so)、静态库(.a)或可执行文件(.exe)
动态库可以直接通过源码编译生成
静态库
程序在运行之前将静态库链接到可执行文件中,程序运行时不再需要静态库
生成方法:
1.xxx.c --> xxx.o
2.通过 ar -rc libxxx.a xxx.o 将xxx.o --> libxxx.a
3.在编译main.c时,通过 -L. -libxxx.a 链接至可执行文件
gcc main.c -L. -libxxx.a
显示:
查看静态库内容:
objdump -S libxxx.a
动态库:
程序在运行的时候,才链接动态库至可执行文件 (可多个程序同时使用动态库)
优点:节约内存和磁盘空间(动态库共享)
生成方法:
1.生成位置无关码:gcc -fPIC -c xxx.c
(xxx.c —> xxx.o)
2.产生共享库格式:gcc -shared -o libxxx.so xxx.o
(xxx.o —> libxxx.so)
3.在编译main.c时,通过 -L. -libxxx.so 链接至可执行文件
gcc main.c -L. -libxxx.so
显示:
注意:
静态库在生成可执行文件之后可以删除,不影响文件的正常执行
动态库在生成可执行文件之后不能删除,否则文件会运行失败
失败原因是:error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory(即:找不到动态库)
注:关于-fPIC 生成位置无关码,实现真正意义上的多个进程共享so文件,这一个库在不同进程中的虚拟地址不同,但操作系统会把它们映射到同一块物理内存上。
请多多指教!!
,