库文件:预先编译好的方法(函数)的集合
标准库文件一般存放在/lib或/usr/lib中,声明.h文件放在/user/include中。
库文件类型:
类型 | 静态库 | 共享库 |
---|---|---|
Windows | .lib | .dll |
Linux | .a | .so |
ldd 查看某个程序的共享库依赖
静态库 libxxx.a
1、将.c文件编译成.o文件(不包括main函数的文件);
2、打包做出库,命令:ar crv libxxx.a *.o
3、使用:gcc -o main main.c -L -lxxx
注意:可以把自己的库放到/usr/lib下(切换root用户),使用时就不用加库的路径了。
共享库 libxxx.so
1、生成共享库 gcc -shared -fPIC -o libmyfoo.so *.c
2、使用:gcc -o main main.c -L. -lxxx
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。
出错的原因:-L -l仅仅给gcc指明了库的路径和名称,操作系统单独加载动态库时还需要知道库的路径。
程序执行时,使得操作系统加载动态库的方法:
- 将动态库拷贝到默认的/usr/lib或/lib下,只有root用户执行。
- 设置环境变量LD_LIBRARY_PATH,使得操作系统加载库时,除了在默认路径下搜索,还需要到用户指定的路径下搜索。设置LD_LIBRARY_PATH的方法:
(1)直接在终端上操作, export LD_LIBRARY_PATH=绝对路径,仅对当前终端有效
(2)直接修改配置文件,expotr LD_LIBRARY_PATH=/home/stu/lib,对任意终端有效。
静态库和共享库区别
1、使用静态库,在链接阶段直接将库中的内容合并到最终的可执行文件中;
使用共享库,在链接阶段只在可执行文件中设置使用的库,运行时有操作系统动态加载到内存上,所以执行速度比共享库要快一点。
2、静态库链接生成的可执行文件体积较大,且包含相同的公共代码,造成内存浪费;
共享库显著减少应用程序可执行文件占用的硬盘空间。
3、静态库文件的更新不会反映到应用程序中,需要重新编译新的静态库;
共享库能够在任何时候更新(修复bug,增加新的功能),并且能够被反映到应用程序中。