库:预先编译好的方法的集合
静态库libxx.a
原理:把要用的方法赋值一遍,所以删除之后不会影响
头文件:库函数的声明;位置:/usr/include/stdio.h
库文件:库函数的实现
构建库:
gcc -c add.c;
gcc -c max.c;
ar crv libfoo.a add.o max.o(库名:foo)
构建可执行程序:gcc -o main main.c -L. -lfoo(.表示当前位置,库和可执行程序在同一路径下)
共享库libxx.so
Windows叫动态链接库.dll
原理:没有拷贝要用到方法,只是做一个标记说明要用,所以删除后不能继续运行
ldd main(一个可执行程序):查看main函数运用了哪些共享库(add.o:···;max.o:···)
构建库:
gcc -c add.c;
gcc -c max.c;
gcc -shared -FPIC -o libfoo.h max.o add.o(add.c、max.c替换add.o、max.o也可以)
构建可执行程序:gcc -o main main.c -L. -lfoo
构建可执行程序时指定了当前位置是给gcc说明,但是main函数执行时仍要找共享库,只有放在标准位置下才能找到,所以要移动共享库到标准位置下:切换管理员(标准位置都已经偏离家目录了,要修改)移动:mv libfoo.so /lib
放到标准位置下之后,gcc -o main main.c -lfoo 不指定路径也可以通过
注(了解):如果库不在标准位置下,也可以通过设置环境变量”LD_LIBRARY_PATH”来指定可执行程序链接库文件的位置。
终端执行代码:
LD_LIBRARY_PATH=.("."代表可执行程序链接库文件的位置为当前位置)
export LD_LIBRARY_PATH
函数实现:gcc -o main main.c -lfoo
静态库和共享库的区别
gcc -o main main.c -L. -lfoo 在同一个位置(标准位置或当前位置)的情况下优先选择共享库
L+路径(.:当前路径) l+库名
静态库:主函数中所调用的方法的实现会在编译时在主函数中拷贝一份;删除库文件,main可以正常运行
共享库:共享库中没有包含(拷贝)用到的库方法,只能做标记,运行程序时动态链接;删除文件,main无法执行;ldd查看可执行程序用到哪些共享库